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выхода.