Tengo curiosidad sobre cómo funciona exactamente esta característica. Considere algo así como¿Cómo sabe el compilador mover las variables locales?
std::unique_ptr<int> f() { std::unique_ptr<int> lval(nullptr); return lval; }
Este código se compila bien, incluso para un tipo de movimiento de sólo, como el compilador implícitamente lo mueve. Pero, lógicamente, para cualquier expresión de retorno, determinar si el resultado se refiere o no a una variable local resolvería el problema de detención, y si el compilador simplemente tratara todas las variables locales como valores en la expresión de retorno, entonces esto sería problemático ya que la variable se puede hacer referencia en esa expresión una vez. Incluso si un local solo tuviera una referencia directa, no podría probar que no tenía otros alias indirectos.
Entonces, ¿cómo sabe el compilador cuándo moverse desde la expresión de retorno?
+1 alta velocidad de respuesta ... ¿Qué es exactamente –
"* save * por el hecho de que el objeto fuente es un parámetro de función" mean? – fredoverflow
@FredOverflow: "Si se cumplen las condiciones para la elisión de copia (excepto que la variable puede ser un parámetro de función)" es lo que significa. La elisión de copia no se aplica a los parámetros de la función, el movimiento automático sí lo hace. – Xeo