unique_ptr<T>no permite la construcción de copias, sino que admite la semántica de movimiento. Sin embargo, puedo devolver un unique_ptr<T>de una función y asignar el valor devuelto a una variable.
#include <iostream>
#include <memory>
using namespace std;
unique_ptr<int> foo()
{
unique_ptr<int> p( new int(10) );
return p; // 1
//return move( p ); // 2
}
int main()
{
unique_ptr<int> p = foo();
cout << *p << endl;
return 0;
}
El código anterior compila y funciona según lo previsto. Entonces, ¿cómo es que esa línea 1no invoca al constructor de la copia y produce errores de compilación? Si tuviera que usar la línea 2en su lugar, tendría sentido (usar la línea también 2funciona, pero no estamos obligados a hacerlo).
Sé que C ++ 0x permite esta excepción unique_ptrya que el valor de retorno es un objeto temporal que se destruirá tan pronto como la función salga, garantizando así la unicidad del puntero devuelto. Tengo curiosidad acerca de cómo se implementa esto, ¿se trata de un caso especial en el compilador o hay alguna otra cláusula en la especificación del lenguaje que explota?
unique_ptr. La pregunta completa es que 1 y 2 son dos formas diferentes de lograr lo mismo.
mainfunción salga, pero no cuando foosalga.