У меня есть класс Whole, который содержит объект класса Part через unique_ptr. Поскольку я не предоставляю экземпляр-экземпляр для Whole, конструктор-копия удаляется из-за члена unique_ptr. Вот код:Оптимизация возвращаемого значения не работает для члена const unique_ptr?
class Part {
};
class Whole {
public:
Whole(std::unique_ptr<Part> part) : part(std::move(part)) {
}
private:
const std::unique_ptr<Part> part; //yields error later!
//std::unique_ptr<Part> part; //ok!
};
Я хотел бы создать целый экземпляр с помощью функции завод под названием сборки()
Whole build() {
auto part = std::unique_ptr<Part>{new Part{}};
return Whole{std::move(part)};
}
, которые я хочу использовать так:
int main() {
auto whole = build();
}
Это работает до тех пор, пока unique_ptr для члена части Whole не объявлен const. Насколько я понимаю, это связано с оптимизацией возвращаемого значения, которая препятствует созданию и копированию временных рядов. Однако, , если я объявляю Whole :: part как const, мой компилятор жалуется, что вызывается удаленный экземпляр-конструктор. Почему невозможно использовать объявление const или есть проблема с этим кодом?
Я использую версию компилятора GNU: (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4
Копирование разрешений не является обязательным. – Lingxi
Перемещение объекта изменяет существующий объект. И, отмечая элемент const, вы явно задали его как не изменяемый. –
Возможно, вы хотели использовать 'std :: unique_ptr part; '? –
juanchopanza