Hat jemand die Notwendigkeit gefunden, den Rückgabeparameter eines Kopierzuweisungsoperators const zu deklarieren?

7

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.

    
Keith M Smith 15.04.2010, 21:20
quelle

7 Antworten

13

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.

    
Charles Bailey 15.04.2010, 23:04
quelle
6

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.

    
R Samuel Klatchko 15.04.2010 21:33
quelle
3

Eine Antwort, die eine von Überladungszuweisungsoperator in C ++ widerspiegelt :

Die Rückgabe von const& erlaubt weiterhin die Zuweisung von Verkettungen:

%Vor%

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

akzeptiert %Vor%

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:

%Vor%

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 ...

    
Michael Burr 15.04.2010 21:48
quelle
2

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:

tun %Vor%

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:

  

[...] 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:

%Vor%     
Péter Török 15.04.2010 21:28
quelle
2

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:

%Vor%     
Potatoswatter 15.04.2010 22:23
quelle
0

Wie bei jeder anderen Verwendung von const ist const der Standardwert, es sei denn, Sie möchten den Benutzer wirklich ändern lassen.

    
Pavel Radzivilovsky 15.04.2010 21:26
quelle
-1

Ja, es sollte const sein. Andernfalls können Clients dies tun:

%Vor%     
Billy ONeal 15.04.2010 21:26
quelle

Tags und Links