25

我有以下代码

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),除非我注释掉析构函数。实际上,我的代码中并不需要这个析构函数,我只是想将它用于调试目的。

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

4

1 回答 1

31

这是因为显式定义的析构函数的存在阻止了为A.

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

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

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

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

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

X 没有用户声明的析构函数,并且

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

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

显式定义移动构造函数(或将其声明为默认值,如juanchopanza在评论中所建议的那样)将解决问题。

于 2013-03-18T20:06:12.663 回答