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

时间:2016-03-09 13:20:45

标签: c++ copy-constructor unique-ptr

我有一个类Whole通过unique_ptr保存类Part的对象。由于我没有为Whole提供copy-constructor,因为unique_ptr成员删除了copy-constructor。这是代码:

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

1 个答案:

答案 0 :(得分:7)

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

所以auto whole = build();无效。 (即使呼叫被省略,呼叫也应该有效)

使用C ++ 17,我们有保证副本省略,删除了限制,使代码正确。