Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 析构函数与唯一性_C++_C++11_Unique Ptr - Fatal编程技术网

C++ 析构函数与唯一性

C++ 析构函数与唯一性,c++,c++11,unique-ptr,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; } A类{ 公众: A(){} ~A(){} 私人: std::向量x; };

我有以下代码

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;
}
A类{
公众:
A(){}
~A(){}
私人:
std::向量x;
};
A f(){
A A;
返回a;
}
int main(){
A=f();
返回0;
}
它不会编译(GCC4.7),除非我注释掉析构函数。实际上,我的代码中并不真正需要这个析构函数,我只是想将它用于调试目的


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

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

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

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

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

-X没有用户声明的复制分配运算符

-X没有用户声明的移动分配运算符

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

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

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


明确定义移动构造函数(或按照注释中的建议将其声明为默认构造函数)将解决此问题。

当询问为什么某些内容无法编译时,包含错误消息总是很有帮助的。@user2183861否,此处未回答此问题。这个问题很难回答different@AndyProwl这个评论与答案无关,请问你在哪里得到C++ 11标准,它在一本书中吗?非常感谢。嗯,你还应该添加
A&operator=(A&&&)
,以便提供移动分配。@宋旺:你可以从下载最新的草稿,但请记住这比当前的官方标准(你可以从ISO购买)要新@ipc:实际上,在我看来,没有明确定义析构函数是最有意义的。但是,是的,如果一个人不想遵循零的规则,他至少应该遵循五的规则。