Return 值优化不适用于 const unique_ptr 成员?
Return value optimization not working for const unique_ptr member?
我有一个 class 整体,它通过 unique_ptr 持有 class 部分的一个对象。由于我没有为 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,此方法就有效。据我了解,这是由于 return 值优化,它阻止了临时文件的创建和复制。然而,
如果我将 Whole::part 声明为 const,我的编译器会抱怨调用了已删除的复制构造函数。为什么不能使用 const 声明或者这段代码有问题?
我使用的是 GNU 编译器版本:
(Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
const std::unique_ptr
不允许 class Whole
.
的移动构造函数
所以auto whole = build();
无效。 (即使呼叫被省略,呼叫也应该有效)
在 C++17 中,我们有消除该限制的保证复制省略,使代码正确。
我有一个 class 整体,它通过 unique_ptr 持有 class 部分的一个对象。由于我没有为 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,此方法就有效。据我了解,这是由于 return 值优化,它阻止了临时文件的创建和复制。然而, 如果我将 Whole::part 声明为 const,我的编译器会抱怨调用了已删除的复制构造函数。为什么不能使用 const 声明或者这段代码有问题?
我使用的是 GNU 编译器版本: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
const std::unique_ptr
不允许 class Whole
.
所以auto whole = build();
无效。 (即使呼叫被省略,呼叫也应该有效)
在 C++17 中,我们有消除该限制的保证复制省略,使代码正确。