xml*_*lmx 0 c++ standards destructor type-traits c++-concepts
#include <type_traits>
struct A
{
~A() {}
};
int main()
{
static_assert(std::is_trivial_v<A>); // error
}
Run Code Online (Sandbox Code Playgroud)
它似乎很明显,std::is_trivial_v<A>将是false如果A有一个析构函数。
但是,从 的cppref 页面中std::is_trivial,没有什么要求A一定不能有析构函数。
什么时候可以 T 有析构函数 std::is_trivial_v<T> ?
你需要在兔子洞里走得更远。cppreference 页面说平凡类型需要是TriviallyCopyable。如果您访问该页面,它需要一个
平凡的非删除析构函数
如果我们访问该链接,我们有
平凡的析构函数
如果以下所有条件都为真,则类 T 的析构函数是微不足道的:
- 析构函数不是用户提供的(意思是,它要么是隐式声明的,要么是在其第一次声明时显式定义为默认值的)
- 析构函数不是虚拟的(即基类的析构函数不是虚拟的)
- 所有直接基类都有简单的析构函数
- 类类型(或类类型数组)的所有非静态数据成员都具有简单的析构函数
平凡析构函数是不执行任何操作的析构函数。具有简单析构函数的对象不需要删除表达式,并且可以通过简单地释放它们的存储来处理。所有与 C 语言兼容的数据类型(POD 类型)都是可破坏的。
所以,是的,它需要一个微不足道的析构函数,而您的用户提供的空析构函数不被认为是微不足道的。
您可以“编写”析构函数并将其视为微不足道的唯一方法是使用
~ClassName() = default;
Run Code Online (Sandbox Code Playgroud)