Мне было интересно, снято ли это ограничение в С++ 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
или что-то еще), но в памяти будет не более одного места, где хранится фактический указатель.
При удалении конструкторов копирования и перемещения создается неподвижный объект. Там, где он создается, его ценности остаются навсегда. Движение позволяет вам иметь уникальную собственность, но не быть неподвижным.
person
Nicol Bolas
schedule
28.10.2011
void
или ссылку. Я имею в виду функцию, которая возвращает новый объект класса. Я уточню. - person Johannes Schaub - litb   schedule 29.10.2011