gpt4 book ai didi

C++11:我可以创建一个字段,其类型具有已删除的析构函数吗?

转载 作者:太空狗 更新时间:2023-10-29 19:46:06 25 4
gpt4 key购买 nike

我有一个类型,其析构函数已被显式删除;我想使该类型的实例成为另一个类的成员。

我的期望是,如果不尝试删除包含类的实例(即包含类的析构函数将无效),那应该没问题。

但是,当尝试实例化父类的构造函数时,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

最佳答案

此行为的一些基本原理:有一种情况,成员对象的析构函数在包含对象的析构函数之外自动调用:以防包含对象的构造函数抛出(其中的某物)。在构造函数退出之前,已经构造的成员和基类子对象的析构函数以构造的相反顺序被调用。

关于C++11:我可以创建一个字段,其类型具有已删除的析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17786033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com