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:实际上,在我看来,没有明确定义析构函数是最有意义的。但是,是的,如果一个人不想遵循零的规则,他至少应该遵循五的规则。