Verhalten der Selbstzuweisung mit dem Parameter const ref

8

Ich bin auf einen sehr alten Code gestoßen, der eine Klasse mit einem definierten Kopierzuweisungsoperator hat, der seinen Parameter als const-Referenz verwendet, aber auch nicht nach einer Selbstzuweisung sucht, also im Wesentlichen:

%Vor%

Wie verhält sich dieser Zuweisungsoperator, wenn sich eine Instanz von A selbst zugewiesen hat? Ich würde annehmen, dass dies Probleme verursacht, da es die Konsistenz des Parameters "unterbricht", jeder Compiler könnte davon ausgehen, dass der Parameter nicht geändert wird und basierend darauf optimiert.

Allerdings geben weder clang noch gcc eine Warnung aus, und das Programm läuft gut. Dies funktioniert auch, wenn ich den Wert von q vor der Zuweisung im Zuweisungsoperator explizit auf 4 ändere.

    
Marius Herzog 07.03.2018, 07:35
quelle

1 Antwort

18

Das Binden eines Objekts an eine const-Referenz macht es nicht plötzlich zu einem festen Bestandteil. Die const gibt nur an, dass die Funktion den Parameter nicht über a ändern kann. Es bedeutet nicht, dass das Objekt, auf das verwiesen wird, selbst konstant sein muss.

Da *this und a das gleiche Objekt legal aliasieren können, besteht in diesem Code kein Risiko. Der Compiler kann keine wilden Annahmen über Aliasing machen.

Die Selbstzuweisung ist nur dann ein Problem, wenn der Objektstatus irgendwie beschädigt sein kann, wenn der Zuweisungsoperator nicht vollständig ausgeführt wird, oder wenn er eine Ressource freigibt, die er dann versucht, von "anderen" zu kopieren. Ihr Beispiel hat kein Risiko, dass dies passiert. Im Allgemeinen sollte man jedoch darauf achten, dass Ausnahmen möglicherweise ausgelöst werden und Ressourcen in Besitz genommen werden.

    
StoryTeller 07.03.2018, 07:38
quelle

Tags und Links