Мне было интересно, было ли снято это ограничение в C ++ 11?
Как это могло быть? Возвращая что-то по значению, вы по определению копируете (или перемещаете) это. И хотя C ++ может разрешить исключение этого копирования / перемещения при определенных обстоятельствах, оно все равно копируется (или перемещается) в соответствии со спецификацией.
Я помню, что было бы полезно разрешить вызывающим функциям использовать возвращаемый объект, но они не могут скопировать значение и сохранить его где-нибудь.
Да. Вы избавляетесь от конструктора / назначения копирования, но допускаете перемещение значения . std::unique_ptr
делает это.
Вы можете вернуть unique_ptr
по значению. Но при этом вы возвращаете «prvalue»: временный объект, который разрушается. Поэтому, если у вас есть функция g
как таковая:
std::unique_ptr<SomeType> g() {...}
Вы можете сделать это:
std::unique_ptr<SomeType> value = g();
но не это :
std::unique_ptr<SomeType> value1 = g();
std::unique_ptr<SomeType> value2 = g();
value1 = value 2;
Но это возможно:
std::unique_ptr<SomeType> value = g();
value = g();
Вторая строка вызывает оператор присваивания перемещения на value
. Он удалит старый указатель и переместит новый указатель в него, оставив старое значение пустым.
Таким образом, вы можете гарантировать, что содержимое любого unique_ptr
хранится только в одном месте. Вы не можете помешать им ссылаться на него в нескольких местах (через указатели на unique_ptr
или что-то еще), но в памяти будет не более одного места, где хранится фактический указатель.
Удаление конструкторов копирования и перемещения создает объект неподвижный . Где он создан, там и остаются его значения, forever . Движение позволяет вам иметь уникальную собственность, но не быть неподвижным.