返回值优化不适用于const unique_ptr成员吗?

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

Jar*_*d42 7

const std::unique_ptr禁止移动类的构造函数Whole。

因此auto whole = build();无效。(即使取消通话,该通话也应有效)

使用C ++ 17,我们可以保证复制省略,从而消除了该限制,使代码正确。