valores todas tipos retornan que parametros lenguaje las funciones ejemplos con c++ rvalue-reference move-semantics c++11

c++ - todas - tipos de funciones en lenguaje c



¿Los parámetros de valor se mueven implícitamente cuando se devuelven por valor? (2)

Considera la siguiente función:

Foo foo(Foo x) { return x; }

¿ return x invocar el constructor de copia o el constructor de movimiento? (Dejemos NRVO a un lado aquí).

Para investigar, escribí una clase simple de Foo que solo se puede mover pero no se puede copiar:

struct Foo { Foo() = default; Foo(const Foo&) = delete; Foo(Foo&&) = default; };

Si el constructor de movimiento se invocó al devolver parámetros de valor por valor, todo debería estar bien. Pero el compilador g ++ actual se queja de la return x con el siguiente mensaje de error:

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 mover de los parámetros de valor se debe hacer explícitamente si se desea. ¿Se conforma o no el comportamiento de g ++?


Este es un código válido. El comportamiento de G ++ no es conforme. MSVC10 soporta este comportamiento.


Si hay un ctor de movimiento para Foo, debería seleccionarse.

Los parámetros de función se excluyen explícitamente de la elision de copia en las declaraciones de devolución (FDIS §12.9p31, primer punto):

  • en una declaración de retorno en una función con un tipo de retorno de clase, cuando la expresión es el nombre de un objeto automático no volátil (que no sea una función o un parámetro de cláusula catch)

Sin embargo, el siguiente párrafo explícitamente vuelve a tener en cuenta los factores de movimiento:

Cuando los criterios para la elección de una operación de copia se cumplen o se cumplirían, salvo por el hecho de que el objeto de origen es un parámetro de función , y el objeto que se va a copiar se designa mediante un lvalor, la resolución de sobrecarga para seleccionar el constructor para la copia es Primero se realiza como si el objeto fuera designado por un valor de r . ...

(El énfasis es mío en ambas citas.)