析构函数和unique_ptr

Bér*_*ger 23 c++ unique-ptr c++11

我有以下代码

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;
}
Run Code Online (Sandbox Code Playgroud)

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

但是,我不明白发生了什么,因此我担心我做错了什么.这里发生了什么?

And*_*owl 29

这是因为显式定义的析构函数的存在阻止了隐式生成移动构造函数A.

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

如果类X的定义没有显式地声明一个移动构造函数,那么当且仅当一个移动构造函数被隐式声明为默认值时

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

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

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

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

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

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

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

  • +1,添加`A(A &&)=默认;`将使其编译. (9认同)