unique_ptr<T>
не дозволяє створювати копію, натомість підтримує семантику переміщення. Тим не менш, я можу повернути a 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
виході.