Der Kopierzuweisungsoperator hat die übliche Signatur:
%Vor%Hat die folgende Unterschrift praktischen Nutzen?
%Vor%Sie können nur das eine oder das andere definieren, aber nicht beides.
Der Hauptgrund dafür, dass der Rückgabetyp der Kopierzuweisung eine nicht konstante Referenz ist, besteht darin, dass es im Standard eine Anforderung für "Zuweisbar" ist.
Wenn Sie den Rückgabetyp als const
referenz angeben, erfüllt Ihre Klasse nicht die Anforderungen für die Verwendung in einem der Standardbibliothekscontainer.
Tu das nicht. Es verhindert, dass ein Client etwas wie folgt schreibt:
%Vor%anstelle der längeren Form:
%Vor%Auch wenn Ihnen der Kurzschreibstil vielleicht nicht gefällt, liegt es wirklich am Benutzer der Bibliothek, zu entscheiden, wie er den Code schreiben möchte.
Eine Antwort, die eine von Überladungszuweisungsoperator in C ++ widerspiegelt :
Die Rückgabe von const&
erlaubt weiterhin die Zuweisung von Verkettungen:
Aber wird einige der ungewöhnlicheren Verwendungen verbieten:
%Vor% Beachten Sie, dass der Zuweisungsoperator eine ähnliche Semantik hat wie in C, wobei der vom Operator =
zurückgegebene Wert kein lvalue ist. In C ++ hat der Standard dies geändert, so dass der Operator =
den Typ des linken Operanden zurückgibt, also ist das Ergebnis ein Lvalue. Aber wie Steve Jessop in einem Kommentar zu einer anderen Antwort bemerkte , währenddessen macht es so, dass der Compiler
selbst bei integrierten Objekten ist das Ergebnis ein nicht definiertes Verhalten für integrierte Objekte, da a
zweimal ohne dazwischenliegenden Sequenzpunkt geändert wird. Dieses Problem wird für Nicht-Built-Ins mit operator=()
vermieden, da der Funktionsaufruf operator=()
als Sequenzpunkt dient.
Ich sehe kein Problem bei der Rückgabe von const&
, es sei denn, Sie möchten die lvalue-Semantik ausdrücklich zulassen (und die Klasse so gestalten, dass sie mit dieser Semantik sinnvoll arbeitet). Wenn Ihre Benutzer etwas Ungewöhnliches mit dem Ergebnis von operator=()
machen wollen, würde ich es vorziehen, dass die Klasse es ablehnt, anstatt zu hoffen, dass es durch Zufall statt durch Design kommt.
Auch. Beachten Sie, dass während Sie sagten:
Sie können nur das eine oder das andere definieren, aber nicht beides.
Das liegt daran, dass die Funktionssignatur in C ++ den Rückgabewerttyp nicht berücksichtigt. Sie könnten jedoch mehrere operator=()
-Assignement-Operatoren haben, die verschiedene Parameter verwenden und verschiedene Typen zurückgeben, die den Parametertypen entsprechen:
Ich bin mir nicht ganz sicher, was Sie damit kaufen würden. Das Objekt, dem es zugeordnet ist (das ist vermutlich die zurückgegebene Referenz), ist in beiden Fällen nicht konstant. Es gibt also keinen logischen Grund, ein const&
zurückzugeben, nur weil die rechte Seite von =
const
ist. . Aber vielleicht vermisse ich etwas ...
Effektives C ++ erklärt, dass dies die Kompatibilität mit den eingebauten C ++ - Typen aufheben würde.
Sie können dies mit plain int
s:
Er argumentiert, wie albern das auch aussieht, man sollte das auch mit seinem eigenen Typ machen können.
Dieses Beispiel gibt es in der 2. Auflage, aber nicht mehr in der 3. Ausgabe. Dieses Zitat aus 3. Ausgabe, Punkt 10, sagt jedoch immer noch:
%Vor%[...] Zuweisung gibt einen Verweis auf sein linkes Argument zurück, und das ist die Konvention, der Sie folgen sollten, wenn Sie Zuweisungsoperatoren für Ihre Klassen implementieren:
Warum besessen alle über (a = b) = c
? Wurde das jemals versehentlich geschrieben?
Es gibt wahrscheinlich einen unvorhergesehenen Nutzen des Ergebnisses der Zuweisung, die geändert wird. Du machst nicht einfach willkürliche Regeln gegen erfundene Beispiele, die lustig aussehen. Semantisch gibt es keinen Grund, dass es const
sein sollte, also deklariere es nicht für lexikalische Nebenwirkungen const
.
Hier ist ein Beispiel für etwas vernünftigen Code, der für const &
Zuweisung bricht:
Wie bei jeder anderen Verwendung von const ist const der Standardwert, es sei denn, Sie möchten den Benutzer wirklich ändern lassen.
Ja, es sollte const
sein. Andernfalls können Clients dies tun:
Tags und Links c++ assignment-operator