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);
}
'Filter' nimmt einen' Vektor' als Kopie, also nein, um die Verschiebungssemantik zu aktivieren, muss man sie per Rvaluebezug nehmen und 'std :: move' verwenden – Valerij
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
@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. –