Zuweisungsoperator mit const Attributen



  • Jud4s schrieb:

    €: Welchen genaueren Sinn soll denn const sonst erfüllen, ausser zu kennzeichnen, das ein Attribut/eine Variable unabänderlich ist?

    Keinen. Aber du solltest nicht den Umkehrschluss ziehen und denken, alles, was sich nicht ändert, müsse const sein. Damit machst du dir in deinem Fall die Wertsemantik kaputt.

    Nochmals: Entweder du verzichtest hier auf const und kapselst deine Klasse vernünftig, oder du verzichtest auf die Speicherung als Werte in STL-Containern.

    Jud4s schrieb:

    Ich hatte gelesen das die Verwendung von const es dem Compiler erleichtert Einsparungen zu machen.

    Vergiss das am besten. Wenn du const auf diese Weise verwendest, musst du dich über Fehler nicht wundern.



  • Danke, ich denke ich werde meine Datenkapselung einfach erneut überdenken müssen.



  • Zwar nicht ganz zum Thema passend, aber zur Frage "Wie implementiere ich den operator = korrekt":

    T& operator = (T other)
    {
        swap(other);
        return *this;
    }
    

    .) Exception-save
    .) Kann sowohl kopieren, als auch moven
    .) Einfach
    .) Performant



  • Edit:
    Narf, da hab ich doch tatsächlich übersehen, dass du den Parameter per value übergibst und damit schon ´ne Kopie erstellt hast. Hab den Rest meines Beitrags mal gelöscht 😃



  • Schau nochmal genau hin. T wird hier per Value genommen und dementsprechend kopiert oder gemoved und am Ende zerstört.



  • 314159265358979 schrieb:

    Schau nochmal genau hin. T wird hier per Value genommen und dementsprechend kopiert oder gemoved und am Ende zerstört.

    Jau, grad gesehen.



  • Bei einem grossen Datentyp ohne COW kann es aber nicht mehr so performant aussehen.



  • Zeig mir einen performanteren :p


  • Mod

    314159265358979 schrieb:

    .) Performant

    Das kommt darauf an. Nämlich darauf, ob nicht eventuell bereits verwendete Resourcen wiederverwendet werden können und somit evtl. etwas gespart werden kann.

    Betrachte z.B.

    vector<int> a(1000,0),b(100,0);
    a = b;
    

    Es ist mir nicht ganz klar, ob vector hier copy&swap durchführen darf (mit entsprechenden Folgen für capacity), jedenfalls wird es nicht vorgeschrieben und wäre u.U. ineffizient.
    copy&swap ist zwar exception-safe, andererseits tritt in diesem Beispiel garantiert keine Exception auf, wenn direkt zugewiesen wird.



  • Das hängt aber davon ab, was der Copy Ctor macht.


Anmelden zum Antworten