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 中,我们有消除该限制的保证复制省略,使代码正确。