C 11:我可以创建一个类型具有删除的析构函数的字段吗?
发布时间:2020-12-16 10:24:47 所属栏目:百科 来源:网络整理
导读:我有一个类型,其析构函数已被显式删除;我想使该类型的实例成为另一个类的成员. 我的期望是,如果没有尝试删除包含类的实例(即包含类的析构函数将无效),应该没问题. 但是,当尝试实例化父类的构造函数时,clang(v3.3)和g(v 4.6.3)都会出错. 例如: class Deleted
我有一个类型,其析构函数已被显式删除;我想使该类型的实例成为另一个类的成员.
我的期望是,如果没有尝试删除包含类的实例(即包含类的析构函数将无效),应该没问题. 但是,当尝试实例化父类的构造函数时,clang(v3.3)和g(v 4.6.3)都会出错. 例如: class DeletedDtor { public: DeletedDtor() {} ~DeletedDtor() = delete; }; class MyClass { public: MyClass() = default; ~MyClass() = delete; private: DeletedDtor a; }; int main() { MyClass *p = new MyClass(); } 在g下,这给出了: test.cpp: In function ‘int main()’: test.cpp:19:30: error: use of deleted function ‘MyClass::MyClass()’ test.cpp:11:5: error: ‘MyClass::MyClass()’ is implicitly deleted because the default definition would be ill-formed: test.cpp:11:5: error: use of deleted function ‘DeletedDtor::~DeletedDtor()’ test.cpp:5:5: error: declared here 自己定义MyClass构造函数,而不是让它采用默认实现,也没有帮助: class DeletedDtor { public: DeletedDtor() {} ~DeletedDtor() = delete; }; class MyClass { public: MyClass(); ~MyClass() = delete; private: DeletedDtor a; }; MyClass::MyClass() : a() {} int main() { MyClass *p = new MyClass(); } 这给出了编译错误: test2.cpp: In constructor ‘MyClass::MyClass()’: test2.cpp:18:24: error: use of deleted function ‘DeletedDtor::~DeletedDtor()’ test2.cpp:5:5: error: declared here 解决方法
这种行为的一些基本原理:在某种情况下,成员对象的析构函数会在包含对象的析构函数之外自动调用:如果(包含对象的话)包含对象的构造函数抛出.在构造函数退出之前,已构造成员和基类子对象的析构函数以相反的构造顺序调用.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |