作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 Whole 类,它通过 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!
};
我想通过名为 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
最佳答案
const std::unique_ptr
不允许移动 Whole
类的构造函数。
所以 auto whole = build();
是无效的。 (即使调用被省略,调用也应该有效)
在 C++17 中,我们有保证复制省略,它消除了该限制,使代码正确。
关于c++ - 返回值优化不适用于 const unique_ptr 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35892771/
我是一名优秀的程序员,十分优秀!