考虑以下代码:
对于
#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 >{});
使用clang 3.7.0
编译没有问题:实例。但是根据标准的总结:
如果以下条件均成立,则类T的默认构造函数是平凡的(即不执行任何操作):
- 构造函数不是用户提供的(即隐式定义或默认定义)
- T没有虚成员函数
- T没有虚基类
- T没有具有默认初始化器的非静态成员。 (自C++11起)
- T的每个直接基类都有一个平凡的默认构造函数
- 类类型的每个非静态成员都有一个平凡的默认构造函数
据我所见,这并不依赖于析构函数的平凡性。
我漏掉了什么吗?这是clang
的bug吗?
补充说明
我发现了一个解决方法:使用static_assert(__has_trivial_constructor( N ));
内置类型特征。clang
、gcc
和MSVC
都支持它。对于
is_noexcept_constructible
类型特征系列,也有解决方法。
is_meow_constructible
被规定为使用变量定义,因此它也考虑了析构函数。 - T.C.N
是可以被默认构造的。然而智能感知并不这么认为。 - Weak to Enuma Elish