c++ - ¿Cómo usar la semántica de movimiento con std:: string durante el retorno de la función?




c++11 move-semantics (2)

Posible duplicado:
C ++ 11 rvalores y movimiento semántico confusión.

Lo que creo que es correcto es

std::string GetLine()
{
std::string str;
std::getline(std::cin, str);
return std::move(str);
}

Pero en este enlace http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html (verifique la parte del encabezado Cómo devolver una referencia-valor explícita desde un función)

que es el hit número 1 de búsqueda de google para semánticas de movimiento muestra una función similar a la firma como

int&& GetInt()
{
int x = 0;
// code here
return std::move(x);
}

De lo que leí en otros lugares, && significa una referencia de valor así que en este caso está devolviendo una referencia a un objeto que no existe.

Entonces, ¿cuál es?

(Sí, sé que mover un int no tiene ningún beneficio real, pero la pregunta es si usar el tipo de retorno de std :: string o std :: string && en la primera función. Y si así es como debería hacerse para todos los tipos).


No hay necesidad de decir return std::move(str); si str es una variable local: si la variable satisface los criterios para la optimización del valor de retorno, en una declaración de return la variable se unirá a una referencia de valor nominal.

Además, tenga en cuenta que probablemente no debería devolver una referencia a una variable local, ni lvalue ni rvalue reference.

Dicho todo, deberías tener:

int foo() { int x; /*...*/ return x; }

std::string bar() { std::string str; /*...*/ return str; }

Respondiendo a la pregunta, tipo de: devolver una string . No move nada, sino que utilice (confíe en) RVO:

std::string func()
{
    std::string rv;
    /* ... */
    return rv;
}

Así es como generalmente se debe hacer. No puede devolver una referencia (valor r o no) a un temporal.







move-semantics