unique_ptr<T>
não permite a construção da cópia, mas suporta a semântica de movimentação. No entanto, posso retornar a unique_ptr<T>
de uma função e atribuir o valor retornado a uma variável.
#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;
}
O código acima compila e funciona como pretendido. Então, como é que essa linha 1
não invoca o construtor de cópia e resulta em erros do compilador? Se eu tivesse que usar a linha 2
, faria sentido (usar a linha também 2
funciona, mas não somos obrigados a fazê-lo).
Eu sei que o C ++ 0x permite essa exceção, unique_ptr
já que o valor de retorno é um objeto temporário que será destruído assim que a função sair, garantindo assim a exclusividade do ponteiro retornado. Estou curioso para saber como isso é implementado, é especial no compilador ou há alguma outra cláusula na especificação de linguagem que isso explora?
unique_ptr
. A questão toda é sobre 1 e 2, sendo duas maneiras diferentes de conseguir a mesma coisa.
main
saída da função, mas não quando a foo
saída for concluída.