unique_ptr<T>
non consente la costruzione di copie, ma supporta la semantica di spostamento. Tuttavia, posso restituire a unique_ptr<T>
da una funzione e assegnare il valore restituito a una variabile.
#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;
}
Il codice sopra si compila e funziona come previsto. Quindi, come mai quella linea 1
non invoca il costruttore di copie e provoca errori del compilatore? Se invece dovessi usare line 2
avrebbe senso (usare anche line 2
funziona, ma non è necessario farlo).
So che C ++ 0x consente questa eccezione unique_ptr
poiché il valore restituito è un oggetto temporaneo che verrà distrutto non appena la funzione uscirà, garantendo così l'unicità del puntatore restituito. Sono curioso di sapere come questo viene implementato, è inserito nel compilatore o c'è qualche altra clausola nella specifica del linguaggio che questo sfrutta?
unique_ptr
. L'intera domanda è che 1 e 2 sono due modi diversi per ottenere la stessa cosa.
main
funzione, ma non alla foo
chiusura.