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 1nie wywołuje konstruktora kopiowania i nie powoduje błędów kompilatora? Gdybym musiał 2zamiast tego użyć linii, miałoby to sens (używanie linii również 2działa, ale nie jesteśmy do tego zobowiązani).
Wiem, że C ++ 0x zezwala na ten wyjątek, unique_ptrponieważ 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.
mainwyjściu z funkcji, ale nie przy foowyjściu.