我有一个类Whole通过unique_ptr保存类Part的对象。由于我没有为Whole提供copy-constructor,因为unique_ptr成员删除了copy-constructor。这是代码:
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!
};
我想通过名为build()
的工厂函数创建一个Whole实例Whole build() {
auto part = std::unique_ptr<Part>{new Part{}};
return Whole{std::move(part)};
}
我想这样使用:
int main() {
auto whole = build();
}
只要Whole的Part成员的unique_ptr未声明为const,这就可以工作。据我所知,这是由于返回值优化导致临时数据的创建和复制。然而, 如果我将Whole :: part声明为const,我的编译器会抱怨已经调用了删除的拷贝构造函数。为什么不能使用const声明或者这个代码是否有问题?
我使用的是GNU编译器版本: (Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4
答案 0 :(得分:7)
const std::unique_ptr
禁止移动类Whole
的构造函数。
所以auto whole = build();
无效。 (即使呼叫被省略,呼叫也应该有效)
使用C ++ 17,我们有保证副本省略,删除了限制,使代码正确。