当 std::is_trivial_v<T> 为真时 T 可以有析构函数吗?

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> ?

Nat*_*ica 8

你需要在兔子洞里走得更远。cppreference 页面说平凡类型需要是TriviallyCopyable。如果您访问该页面,它需要一个

平凡的非删除析构函数

如果我们访问该链接,我们有

平凡的析构函数

如果以下所有条件都为真,则类 T 的析构函数是微不足道的:

  • 析构函数不是用户提供的(意思是,它要么是隐式声明的,要么是在其第一次声明时显式定义为默认值的)
  • 析构函数不是虚拟的(即基类的析构函数不是虚拟的)
  • 所有直接基类都有简单的析构函数
  • 类类型(或类类型数组)的所有非静态数据成员都具有简单的析构函数

平凡析构函数是不执行任何操作的析构函数。具有简单析构函数的对象不需要删除表达式,并且可以通过简单地释放它们的存储来处理。所有与 C 语言兼容的数据类型(POD 类型)都是可破坏的。

所以,是的,它需要一个微不足道的析构函数,而您的用户提供的空析构函数不被认为是微不足道的。

您可以“编写”析构函数并将其视为微不足道的唯一方法是使用

~ClassName() = default;
Run Code Online (Sandbox Code Playgroud)