2014-05-21 6 views
5

In der folgenden Situation kann ein Compiler das Funktionsargument v automatisch verschieben oder muss es manuell deklariert werden?Kann ein Compiler automatisch ein Funktionsargument verschieben, wenn der Funktionsaufruf die Return-Anweisung ist?

std::vector Filter(std::vector v); 

void DoSomeStuffAndCallFilter(std::vector v) 
{ 
    // do some stuff to v 

    // can the compiler automatically std::move v in this call? 
    // ie. return Filter(std::move(v)); 
    // 
    return Filter(v); 
} 
+3

'Filter' nimmt einen' Vektor' als Kopie, also nein, um die Verschiebungssemantik zu aktivieren, muss man sie per Rvaluebezug nehmen und 'std :: move' verwenden – Valerij

+0

Es braucht' vector' als Kopie, um das Schreiben von zwei Überladungen zu sparen 'const std :: vector &' und 'std :: vector &&'. Wenn es einen r-Wert brauchte, müßten Sie 'std :: move' noch manuell in den aufrufenden Code schreiben? – fun4jimmy

+3

@Valerij: Das ist falsch. Er muss "std :: move" aufrufen, wenn er "v" an "Filter" übergibt, aber die Signatur von "Filter" muss nicht geändert werden. –

Antwort

7

In Ihrem Fall kann der Compiler tun so als erlaubt Optimierung unter der As-if-Regel, weil es die destructor und Copy-Konstruktor Ihrer std::vector genau kennt, und kann somit beweisen, gibt es keinen Unterschied zu das beobachtbare Verhalten.

Dennoch ist es eine "Qualität der Implementierung Problem" und hängt von starken Optimierungen ab.

+0

Würden Sie empfehlen, das 'std :: move' in dieser Situation hinzuzufügen oder es dem Compiler überlassen, es zu optimieren? – fun4jimmy

+3

@ fun4jimmy: Ich würde empfehlen, 'std :: move' hinzuzufügen. Es macht die Absicht der Programmierer klar und wird zuverlässig über alle Compiler hinweg arbeiten. – MFH