uso el código de abajo a prueba de copia elisión:¿Por qué copiar elision no funciona con std :: move?
class foo
{
public:
foo() {cout<<"ctor"<<endl;};
foo(const foo &rhs) {cout<<"copy ctor"<<endl;}
};
int g(foo a)
{
return 0;
}
int main()
{
foo a;
g(std::move(a));
return 0;
}
que esperaba sólo el constructor por defecto sería llamado porque el argumento de g()
es un valor de lado derecho y de la copia se elide. Pero el resultado muestra que se llama tanto al constructor predeterminado como al constructor de copia. ¿Por qué?
Y si cambio la función llame al g(foo())
, la copia será eliminada. ¿Cuál es la diferencia entre los tipos de devolución de foo()
y std::move(a)
? ¿Cómo puedo hacer que el compilador elite copie en un lvalue?
No puede.'g' toma su parámetro por valor para que el compilador tenga que asegurarse de que el objeto pasado sea distinto de cualquier objeto accesible desde el alcance de la llamada. Si el objeto que se pasa es un lvalue, no hay temporal que eliminar y no se puede eliminar una copia. –
¿Cuántas llamadas a destructor esperaba? ;) – curiousguy
Es posible que desee [leer] (http://stackoverflow.com/a/11540204/252000) en lo que 'std :: move' realmente hace. – fredoverflow