c++ - 返回值优化不适用于 const unique_ptr 成员?

标签 c++ copy-constructor unique-ptr

我有一个 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/

相关文章:

c++ - 构造函数依赖注入(inject) : unique_ptr + move vs shared_ptr

c++ - 如何将 memcpy 与 unique_ptr 一起使用

c++ - 这个指针和方括号重载

c++ - 在 C++ 中将队列复制到 vector 是错误的

c++ - 我不断收到一条错误消息,说我的类(class)没有命名类型

c++ - 具有默认参数的复制构造函数

c++ - 为什么在类中初始化的非整数静态数据成员必须是 constexpr?

c++ - 双链表复制构造函数(不能尾对头复制)

c++ - 调试断言失败 C++

使用 _aligned_malloc() 的 unique_ptr<> 的 C++ 数据对齐