unique_ptr<T> не позволяет создавать копии, вместо этого поддерживает семантику перемещения. Тем не менее, я могу вернуть unique_ptr<T> из функции и присвоить возвращаемое значение переменной.
#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;
}
Приведенный выше код компилируется и работает по назначению. Итак, как получается, что строка 1 не вызывает конструктор копирования и не приводит к ошибкам компилятора? Если бы мне пришлось использовать строку 2, то это имело бы смысл (использование линии 2 тоже работает, но мы не обязаны это делать).
Я знаю, что С++ 0x разрешает это исключение с unique_ptr, поскольку возвращаемое значение является временным объектом, который будет уничтожен, как только функция выйдет, тем самым гарантируя уникальность возвращаемого указателя. Мне интересно, как это реализовано, является ли оно особенным в компиляторе или есть ли какое-то другое предложение в спецификации языка, которое это использует?