std::unique_ptr<int> ptr() {
std::unique_ptr<int> p(new int(3));
return p; // Why doesn't this require explicit move using std::move?
} // Why didn't the data pointed to by 'p' is not destroyed here though p is not moved?
int main() {
std::unique_ptr<int> a = ptr(); // Why doesn't this require std::move?
std::cout << *a; // Prints 3.
}
Nel codice precedente, la funzione ptr()
restituisce una copia di p
. Quando lo p
esce dal campo di applicazione, i dati "3" dovrebbero essere eliminati. Ma come funziona il codice senza alcuna violazione di accesso?Come può un valore unique_ptr essere restituito dal valore senza std :: move?
In realtà utilizza il 'std :: unique_ptr <>' [s move constructor] (http : //en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr). –
Vedere [questa domanda correlata] (http://stackoverflow.com/questions/4316727/returning-unique-ptr-from-functions). E chi ha chiuso questo come un capriccio di "comportamento indefinito" ha bisogno di un caffè. –
Questo è chiamato [copia elision] (http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –