我有一个类型,其析构函数已被显式删除; 我想使该类型的实例成为另一个类的成员.
我的期望是,如果没有尝试删除包含类的实例(即包含类的析构函数将无效),应该没问题.
但是,当尝试实例化父类的构造函数时,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();
}
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
自己定义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();
}
Run Code Online (Sandbox Code Playgroud)
这给出了编译错误:
test2.cpp: In constructor ‘MyClass::MyClass()’:
test2.cpp:18:24: error: use of deleted function ‘DeletedDtor::~DeletedDtor()’
test2.cpp:5:5: error: declared here
Run Code Online (Sandbox Code Playgroud)
这种行为的一些基本原理:在某种情况下,成员对象的析构函数会在包含对象的析构函数之外自动调用:如果(包含对象的话)包含对象的构造函数抛出.在构造函数退出之前,已构造成员和基类子对象的析构函数以相反的构造顺序调用.
| 归档时间: |
|
| 查看次数: |
416 次 |
| 最近记录: |