析构函数和unique_ptr

时间:2013-03-18 20:04:05

标签: c++ c++11 unique-ptr

我有以下代码

class A {
    public:
        A(){}
        ~A(){}
    private:
        std::vector<std::unique_ptr<double> > x;
};

A f() {
    A a;
    return a;
}

int main() {
    A a=f();
    return 0;
}

它不编译(gcc 4.7),除非我注释掉析构函数。实际上,我在代码中并不需要这个析构函数,我只想将它用于调试目的。

然而,我不明白发生了什么,因此我担心我做错了什么。这里发生了什么?

1 个答案:

答案 0 :(得分:28)

这是因为存在明确定义的析构函数会阻止隐式生成A的移动构造函数。

根据C ++ 11标准的第12.8 / 9段:

  

如果类X的定义没有显式声明移动构造函数,则会隐式声明一个   当且仅当

时默认为      

- X没有用户声明的复制构造函数,

     

- X没有用户声明的复制赋值运算符

     

- X没有用户声明的移动赋值运算符

     

- X没有用户声明的析构函数

     

- 移动构造函数不会被隐式定义为已删除。

现在没有移动构造函数,要从f()返回值,编译器将尝试调用隐式生成的复制构造函数(仍然为了向后兼容性而生成)。但是,std::unique_ptr是不可复制的。因此,错误。

明确定义移动构造函数(或在评论中将juanchopanza的建议声明为默认值)将解决问题。