📅  最后修改于: 2023-12-03 15:29:57.244000             🧑  作者: Mango
在C++11标准中,新增了一个非常有用的类型特性trait:std::is_trivially_default_constructible
。它的作用是判断某个类型是否可以被默认构造函数快速构造,也就是是否是trivially default constructible(可以理解为是否是“平凡的默认构造”)。
在使用这个trait的过程中,可能会涉及到CD(Class Definition,类定义)中带有std::is_trivially_default_constructible
的场景,下面我们来看看一个例子。
#include <iostream>
#include <type_traits>
class Cd {
public:
Cd() = default;
Cd(const Cd&) = default;
Cd(Cd&&) = default;
virtual ~Cd() = default;
private:
int i;
};
int main() {
std::cout << std::boolalpha;
std::cout << std::is_trivially_default_constructible<Cd>::value << '\n';
return 0;
}
在上述示例程序中,我们定义了一个名为Cd的类,并在其中添加了默认构造函数、拷贝构造函数、移动构造函数以及虚析构函数。这些成员函数的默认实现都是使用= default
语句,表示使用编译器生成的默认实现。
接着,在main
函数中,我们使用std::is_trivially_default_constructible
判断Cd类是否是trivially default constructible,并通过std::cout
语句输出结果。
在运行示例程序后,我们可以看到控制台输出了false
,这意味着Cd类并不是trivially default constructible。
为什么Cd类不是trivially default constructible呢?这是因为除了数据成员之外还有一个虚析构函数,它破坏了Cd类的“平凡性”。实际上,只有当类中所有成员都是trivially constructible并且没有虚函数时,才可以判断这个类是trivially default constructible的。
上述示例演示了如何使用std::is_trivially_default_constructible
来判断一个类是否是trivially default constructible。这个trait在模板元编程中非常有用,可以帮助我们避免使用不必要的默认构造函数。