Hace un tiempo me dijeron que el patrón habitual para implementar operadores bianuales necesita un move
final en la devolución.C++ 0x T operador + (const T &, T &&) patrón, todavía necesita mover?
Matrix operator+(const Matrix &a, Matrix &&b) {
b += a;
return std::move(b);
}
Pero ahora no es la regla especial que en un return
el compilador puede tratar el valor de retorno como temporal, y luego esto no sería necesario - sería suficiente un simple return b
.
Pero, de nuevo, b
tiene un nombreen esta función, por lo tanto, su lValue un - lo que dificulta que el compilador m considere que sea un trabajador temporal, y se requiere que el move
.
¿Sigue siendo así en la versión más reciente del estándar C++ 0x? Necesitamos el move
para implementar el patrón anterior?
De acuerdo con [la respuesta] (http://stackoverflow.com/questions/6009004/are-value-parameters-implicitly-moved-when -returned-by-value/6009012 # 6009012), el 'std :: move' no es necesario. – fredoverflow
Aunque podría hacer una diferencia que el parámetro sea 'Matrix &&' en lugar de 'Matrix' ... – fredoverflow
It * is * complicated, yes. Y sí, creo que tienes razón. Si su parámetro a * value * como 'Matrix', entonces tiene una copia prístina para usted solo: una temperatura. El compilador sabe que puedes atraparlo. Con 'Matrix &&' No estoy * que * seguro- – towi