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
работает, но мы не обязаны это делать).
Я знаю, что C ++ 0x допускает это исключение, unique_ptr
поскольку возвращаемое значение является временным объектом, который будет уничтожен при выходе из функции, что гарантирует уникальность возвращаемого указателя. Мне любопытно, как это реализовано, это специальный случай в компиляторе или есть какое-то другое предложение в спецификации языка, которое это эксплуатирует?
unique_ptr
. Весь вопрос в том, что 1 и 2 - это два разных способа достижения одного и того же.
main
выхода из функции, но не после foo
выхода.