unique_ptr<T>
nie zezwala na tworzenie kopii, zamiast tego obsługuje semantykę przenoszenia. Jednak mogę zwrócić a unique_ptr<T>
z funkcji i przypisać zwróconą wartość do zmiennej.
#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;
}
Powyższy kod kompiluje się i działa zgodnie z przeznaczeniem. Dlaczego więc ta linia 1
nie wywołuje konstruktora kopiowania i nie powoduje błędów kompilatora? Gdybym musiał 2
zamiast tego użyć linii, miałoby to sens (używanie linii również 2
działa, ale nie jesteśmy do tego zobowiązani).
Wiem, że C ++ 0x zezwala na ten wyjątek, unique_ptr
ponieważ zwracana wartość jest obiektem tymczasowym, który zostanie zniszczony, gdy tylko funkcja wyjdzie, co gwarantuje unikalność zwracanego wskaźnika. Jestem ciekawy, jak to jest zaimplementowane, czy jest to specjalnie uwzględnione w kompilatorze, czy też istnieje specyfikacja językowa, którą wykorzystuje?
unique_ptr
. Całe pytanie dotyczy 1 i 2, które są dwoma różnymi sposobami osiągnięcia tego samego.
main
wyjściu z funkcji, ale nie przy foo
wyjściu.