2015-01-23 20 views
16

man annehmen, hat eine Funktion mit dem folgenden Prototypwird zweimal in einem einzigen vollen Ausdruck zu bewegen erlaubt

template<typename T>  
std::unique_ptr<T> process_object(std::unique_ptr<T> ptr); 

Die Funktion (eine verschobene Version), um das Objekt zurückgeben kann, die ihm übergeben wurde, oder eine ganz andere Objekt.

Ist es legal C++, diese Funktion wie folgt zu verwenden?

std::unique_ptr<Widget> pw(new Widget()); 

pw = process_object(std::move(pw)); 

Wenn ich mich richtig erinnere, gibt es eine C/C++ Regel, die in einem einzigen vollen Ausdruck ein Objekt mehr als einmal verbieten ändern. Gilt diese Regel hier? Wenn ja, gibt es eine Möglichkeit, dieses Idiom in einer einzigen Zeile anders auszudrücken?

Was passiert, wenn man std::unique_ptr durch den verachteten std::auto_ptr ersetzt?

+0

Meintest du 'process_object' um ein' std :: unique_ptr && 'Argument zu nehmen? – Walter

+0

@Walter Warum würdest du das erwarten? Der Besitz eines 'unique_ptr' wird nach Wert übergeben. –

+0

'auto_ptr' ist veraltet. – Walter

Antwort

20

Ist es legal C++, diese Funktion wie folgt zu verwenden?

Ja, das ist in Ordnung.

Wenn ich mich richtig erinnere, gibt es eine C/C++ - Regel, die das mehrmalige Ändern eines Objekts in einem einzigen vollständigen Ausdruck verbietet.

Nicht ganz. Sie können ein Objekt nicht mehr als einmal ändern (oder es ändern und seinen Wert verwenden) mit nicht-sequenziellen Zugriffen.

Gilt diese Regel hier?

Nein. Die Auswertung des Funktionsarguments erfolgt vor dem Funktionsaufruf, der vor der Zuweisung sequenziert wird. Also sind die zwei Zugriffe sequenziert und alles ist gut.

+7

Shameless Plug: Ich schrieb einen Artikel über [die Sequenzregeln] (http://josephmansfield.uk/articles/c++sequenced-before-graphs.html), die durch die Visualisierung der Regeln mit Grafiken hilft. –

+2

@JosephMansfield Ich möchte dir ein Bier kaufen. – bolov