use*_*680 3 c++ copy-constructor unique-ptr
我有一个全类,它通过unique_ptr持有类Part的对象。由于我没有为Whole提供复制构造函数,因此由于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!
};
Run Code Online (Sandbox Code Playgroud)
我想通过工厂函数build()创建一个Whole实例。
Whole build() {
auto part = std::unique_ptr<Part>{new Part{}};
return Whole{std::move(part)};
}
Run Code Online (Sandbox Code Playgroud)
我想这样使用:
int main() {
auto whole = build();
}
Run Code Online (Sandbox Code Playgroud)
只要未将Whole的Part成员的unique_ptr声明为const,此方法就起作用。据我了解,这是由于返回值优化导致无法创建和复制临时文件。但是,如果我将Whole :: part声明为const,我的编译器会抱怨删除的copy-constructor被调用。为什么不能使用const声明,或者此代码仍然存在问题?
我正在使用GNU编译器版本:(Ubuntu 4.8.4-2ubuntu1〜14.04.1)4.8.4
const std::unique_ptr禁止移动类的构造函数Whole。
因此auto whole = build();无效。(即使取消通话,该通话也应有效)
使用C ++ 17,我们可以保证复制省略,从而消除了该限制,使代码正确。