编译器同意,下面的X和Y是默认可构造的,但不是平凡的(demo)。
#include <type_traits>
struct X { int x {}; };
struct Y { int y = 0; };
static_assert(std::is_default_constructible_v<X>);
static_assert(std::is_default_constructible_v<Y>);
static_assert(!std::is_trivially_default_constructible_v<X>);
static_assert(!std::is_trivially_default_constructible_v<Y>);
Run Code Online (Sandbox Code Playgroud)
为什么它们不是微不足道的?根据 cppreference.com(请参阅 参考资料is_trivially_constructible),在默认构造期间必须调用一个不平凡的操作。那是哪一个?
https://en.cppreference.com/w/cpp/language/default_constructor#Trivial_default_constructor说:
如果满足以下所有条件,则类 T 的默认构造函数很简单(即不执行任何操作):
- ...
- T 没有带有默认初始值设定项的非静态成员。(自 C++11 起)
- ...