Ruft der folgende Code undefiniertes Verhalten auf?

8

Ich würde gerne so etwas machen

%Vor%

Meine Frage ist: Die Reihenfolge der Funktionsargumentbewertung ist nicht spezifiziert, also ist es sicher, einen Wert zu übergeben, der in einem Argument verschoben wird, und das Ergebnis des Aufrufs einer anderen Funktion mit der gleichen Instanz , übergeben als reference-to-const, als das andere Argument?

Ich denke, die Frage läuft darauf hinaus, wann genau der eigentliche Verschiebungsvorgang ausgeführt wird, ein Punkt, an dem ich nicht ganz klar bin (besonders wenn es darum geht, die Optimierung eingeschaltet zu haben).

    
wakjah 17.12.2014, 17:35
quelle

3 Antworten

9

Das eigentliche "Verschieben" findet erst statt, wenn der Move-Konstruktor von std::unique_ptr<Foo> ausgeführt wird (alle std::move() macht den const FooPtr & rvalue in eine FooPtr && rvalue-Referenz). Dies tritt erst auf, wenn der Konstruktor mit zwei Argumenten Baz , an den Sie delegieren, aufgerufen wird. Um dies zu erreichen, müssen zuerst alle Argumente dieses Konstruktors ausgewertet werden. Daher wird jede Verwendung des Objekts foo beim Auswerten dieser Argumente vor der tatsächlichen "Bewegung" der unique_ptr -Instanz erfolgen.

Da Sie den FooPtr (aka std::unique_ptr<Foo> nach Wert und std::unique_ptr nur move-only übergeben, löst dies eine Verschiebungskonstruktion aus, wenn das erste Argument des Konstruktors mit zwei Argumenten ausgewertet wird. Seit der Reihenfolge von Bewertung von Argumenten ist nicht spezifiziert, diese Verschiebung kann oder kann nicht vor der Auswertung des zweiten Arguments auftreten.Daher ist das Verhalten Ihres Beispiels nicht spezifiziert.

    
Jason R 17.12.2014, 17:43
quelle
4

std::move ist keine Operation, sondern eine Umwandlung in eine r-Wert-Referenz. Die Verschiebeoperation wird innerhalb des anderen Baz -Konstruktors ausgeführt. Das Ergebnis sollte funktionieren.

    
nasser-sh 17.12.2014 17:44
quelle
4

Scott Meyers erwähnte eine ähnliche SO-Frage in seinem Beitrag Sollen Nur-Bewegungstypen je nach Wert übergeben werden? . Es scheint, dass es keine definitive Antwort gibt, ob sie nach Wert weitergegeben werden sollten oder nicht, aber dies kann eindeutig zu einem unspezifizierten Verhalten führen, und in Ihrem Fall auch.

    
Roman L 17.12.2014 17:59
quelle