析构函数被显式delete的类是否属于trivially copyable类型?
#include <type_traits> struct A { ~A() = delete; }; static_assert(std::is_trivially_copyable_v<A>); int main() { }
上述代码可以在gcc、clang编译器下正常编译通过,对应的结论是:析构函数被显式删除的类,只要满足其余判定条件,属于可平凡复制(trivially copyable)类型。
判定依据
根据C++标准的定义,可平凡复制类型的判定规则如下:
- 类的所有拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符,要么是平凡的,要么被删除
- 类至少存在一个未被删除的拷贝/移动构造函数、拷贝/移动赋值运算符
- 类的析构函数是平凡的
很多人存在的误区是认为被delete的析构函数不属于平凡析构,这是混淆了「析构是否可调用」和「析构是否平凡」两个概念:
- 平凡析构的核心判定要求是析构函数非用户提供(user-provided),显式用
= delete声明的析构函数不属于用户提供的函数,只要类没有虚函数、虚基类,所有非静态成员和基类的析构都是平凡的,那该类的析构函数就属于平凡析构,哪怕它被标记为删除。 - 析构函数被删除仅代表你无法手动销毁该类的实例,不影响可平凡复制类型的判定。
内容的提问来源于stack exchange,提问作者vbstb
相关产品推荐
相关产品推荐

