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 1
no invoca al constructor de la copia y produce errores de compilación? Si tuviera que usar la línea 2
en su lugar, tendría sentido (usar la línea también 2
funciona, pero no estamos obligados a hacerlo).
Sé que C ++ 0x permite esta excepción unique_ptr
ya 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.
main
función salga, pero no cuando foo
salga.