unique_ptr<T>
no permite la construcción de copias, en cambio admite la semántica de movimientos. Sin embargo, puedo devolver un unique_ptr<T>
desde una función y asignar el valor devuelto a una variable.La devolución de unique_ptr de las funciones
#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 la línea 1
no invoca el constructor de copia y da como resultado errores de compilación? Si tuviera que usar la línea 2
, tendría sentido (usar la línea 2
también funciona, pero no estamos obligados a hacerlo).
Sé que C++ 0x permite esta excepción a 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 singularidad del puntero devuelto. Tengo curiosidad acerca de cómo se implementa esto, ¿está incluido en el compilador especial o hay alguna otra cláusula en la especificación del lenguaje que explote?
Hipotéticamente, si estuviera implementando un método * factory *, ¿preferiría que 1 o 2 devolvieran la producción de la fábrica? Supongo que este sería el uso más común de 1 porque, con una fábrica adecuada, realmente desea que la propiedad de la cosa construida pase a la persona que llama. – Xharlie
@Xharlie? Ambos pasan la propiedad de 'unique_ptr'.Toda la cuestión es que 1 y 2 son dos formas diferentes de lograr lo mismo. – Praetorian