considera la siguiente función:¿Los parámetros de valor se mueven implícitamente cuando se devuelve por valor?
Foo foo(Foo x)
{
return x;
}
Will return x
invocar el constructor de copia o el movimiento del constructor? (Vamos a dejar NRVO a un lado aquí.)
Para investigar, escribí una clase simple Foo
que sólo es móvil pero no copiable:
struct Foo
{
Foo() = default;
Foo(const Foo&) = delete;
Foo(Foo&&) = default;
};
Si el constructor movimiento se invoca al volver parámetros de valor por valor, toda debería estar bien. Pero la corriente compilador g ++ se queja de return x
con el mensaje de error siguiente:
error: deleted function 'Foo::Foo(const Foo&)'
Si sustituyo return x
con return std::move(x)
, todo está bien. A partir de esto, concluyo que el cambio de los parámetros de valor debe hacerse explícitamente si se desea. ¿El comportamiento de g ++ es conforme o no?
Votación máxima. Este fue un cambio relativamente tardío al borrador que explica por qué aún no se implementa en todas partes. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1148 –