Nehmen wir an, ich habe die folgende minimale Beispielklasse:
%Vor% Dies gibt move
wie erwartet aus. Nach Effektiv C ++, Punkt 3, sollte ich const Foo
von operator+
zurückgeben, um das Konstrukt wie a + b = c
zu vermeiden, d.h.:
Leider beginnt dies plötzlich Kopierzuweisung anstelle von Zuweisungsoperator aufzurufen. [Ich benutze gcc 4.8.4 unter Ubuntu, aber es ist wahrscheinlich nichts mit dem Compiler zu tun]
Wie kann ich sicherstellen, dass a + b = c
nicht kompiliert werden kann und gleichzeitig die Verschiebung für a = b + c
aufgerufen wird? Oder gibt es mit der Einführung der Bewegungssemantik keine Möglichkeit, beides gleichzeitig zu erreichen?
Ich habe am Ende lvalue Referenz Qualifier wie von Caninonos im Kommentar und von max66 in jetzt gelöschte Antwort (aber 10k Benutzer können es sehen).
%Vor%Es ist einfach zu implementieren und es bietet ein besseres Interface-Design, da die Zuordnung zu etwas anderem, dass Lvalue nicht sinnvoll klingt und eine mögliche Fehlerquelle ist.
Es sollte jedoch beachtet werden, dass die Möglichkeit, a + b = c
versehentlich zu schreiben, sehr gering ist. Auch vom Compiler erzeugte Zuweisungsoperatoren sind nicht lvalreferenzqualifiziert, und wir können a + b = c
mit Standardtypen schreiben, z. mit std::string
oder mit std::complex
.