unique_ptr<T>
не позволяет создавать копии, вместо этого поддерживает семантику перемещения. Тем не менее, я могу вернуть unique_ptr<T>
из функции и присвоить возвращаемое значение переменной.Возвращение unique_ptr из функций
#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
, поскольку возвращаемое значение является временным объектом, который будет уничтожен, как только функция выйдет, тем самым гарантируя уникальность возвращаемого указателя. Мне интересно, как это реализовано, является ли оно особенным в компиляторе или есть какое-то другое предложение в спецификации языка, которое это использует?
Гипотетически, если вы применяли метод * factory *, предпочитаете ли вы 1 или 2 возвращать заводские данные? Я полагаю, что это было бы наиболее распространенным использованием 1, потому что, с надлежащей фабрикой, вы действительно хотите, чтобы собственность на конструированную вещь передавалась вызывающему. – Xharlie 2015-09-15 11:10:12
@ Xharlie? Они оба передают право собственности на `unique_ptr`.Весь вопрос в том, что 1 и 2 являются двумя разными способами достижения одного и того же. – Praetorian 2015-09-15 16:28:07