c++ - ¿Cómo devolver un objeto desde una función considerando valores de C ++ 11 y mover semántica?



2 Answers

Ninguno de ellos copiará, pero el segundo se referirá a un vector destruido. Las referencias de valores nominales casi nunca existen en el código regular. Lo escribes tal como habrías escrito una copia en C ++ 03.

std::vector<int> return_vector()
{
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> rval_ref = return_vector();

Excepto ahora, el vector se mueve. El usuario de una clase no trata con sus referencias de valor en la gran mayoría de los casos.

c++ c++11 move-semantics rvalue-reference c++-faq

Estoy tratando de entender las referencias de valores y mover la semántica de C ++ 11.

¿Cuál es la diferencia entre estos ejemplos y cuál de ellos no va a hacer una copia vectorial?

Primer ejemplo

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();

Segundo ejemplo

std::vector<int>&& return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Tercer ejemplo

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();



Ninguno de esos hará ninguna copia extra. Incluso si no se usa RVO, el nuevo estándar dice que la construcción de movimientos es preferible copiar cuando se realizan devoluciones, creo.

Creo que tu segundo ejemplo causa un comportamiento indefinido porque estás devolviendo una referencia a una variable local.






Related