考虑以下代码:
#include <type_traits>
struct T {};
static_assert(std::is_trivially_destructible< T >{});
static_assert(std::is_trivially_default_constructible< T >{});
struct N { ~N() { ; } };
static_assert(!std::is_trivially_destructible< N >{});
static_assert(!std::is_trivially_default_constructible< N >{});
Run Code Online (Sandbox Code Playgroud)
如果满足以下所有条件,则类T的默认构造函数是微不足道的(即不执行任何操作):
- 构造函数不是用户提供的(即,隐式定义或默认)
- T没有虚拟成员函数
- T没有虚拟基类
- T没有使用默认初始值设定项的非静态成员.(自C++ 11以来)
- T的每个直接基都都有一个普通的默认构造函数
- 类类型的每个非静态成员都有一个普通的默认构造函数
正如我所看到的,不依赖于析构函数的琐碎性.
我错过了什么?是clangbug吗?
我找到了一个解决方法:static_assert(__has_trivial_constructor( N ));内置类型特征.有支持clang,gcc及MSVC.
对于is_noexcept_constructible类型特征的家庭也有解决方法.