Názor ke článku JSON pro C++11 s immutabilním DOMem. od Ondřej Novák - Pokud umožňujete kopírovat sdílením, tedy že máte konstruktor...

  • 13. 1. 2017 16:35

    Ondřej Novák

    Pokud umožňujete kopírovat sdílením, tedy že máte konstruktor který přijímá const referenci a provede sdílení, pak vám const nepomůže, protože ho tímto způsobem obejdete

    Pseudo příklad

    const Value cv = {10,20,30}
    Value v (cv);
    v.push_back(40); // < změní se i cv!!;

    Musel byste se vzdát jiných věcí. Tak například kopírování sdílením... tedy vytvářet plnohodnotné kopie. Kopírovací konstruktor by při přijmu const hodnoty prostě nemohl sdílet, musel by kopírovat. Přitom pokud kopírujete do objektu o kterém víte, že taky bude pouze const, pak je vytváření hluboké kopie zbytečné. Kopírovací konstruktor však tuhle informaci nemá

    Value x(y); // potřebuju kopii
    const Value x(y); // mohu sdílet.

    Já to ze začátku řešil tak, že jsem měl dvě třídy. Value a ConstValue. Objekty Value by obsahovaly měnitelné kontejnery, objekty ConstValue by se měnit nedaly. No jenže co když chcete mít měnitelný kontejner konstantních kontejneru? Kterou třídu na to použijete? Já zavedl třetí....

    No výsledek nebyl vůbec přehledný. Navíc jsem časem zjistil, že používám v zásadě jen ConstValue a objekty, kterým jsem říkal buildery, tedy něco, co mi pomáhá vytvořit kontejner (objekt , pole) než z něho udělám ConstValue. A tak jsem to celé přepsal do současné podoby.