std::is_default_constructible_v是 C++17 引入的一个类型特性(type trait),用于在编译期判断某个类型是否可以被默认构造(即能否通过T()或new T()的形式创建对象)。它是一个变量模板,等价于std::is_default_constructible<T>::value,使用起来更简洁。
核心规则
若类型
T存在一个有效的默认构造函数(包括编译器自动生成的、用户显式定义的、或者所有成员都有默认初始值且无用户提供构造函数等情况),则std::is_default_constructible_v<T>为true。若类型有删除的默认构造函数、或仅提供了带参构造函数且未定义默认构造,则为
false。对于引用类型、数组类型等也有明确规定(通常为
false,除了少数情况)。
#include <iostream> #include <type_traits> // 必须包含此头文件 // 类 A:有默认构造函数(编译器自动生成) class A { public: int x; // 没有显式定义任何构造函数,编译器会生成默认构造 }; // 类 B:只提供了带参构造函数,删除了默认构造 class B { public: B(int value) : data(value) {} B() = delete; // 显式删除默认构造 private: int data; }; // 类 C:有用户定义的默认构造函数 class C { public: C() : value(0) {} private: int value; }; int main() { // 编译期检查,输出结果 std::cout << std::boolalpha; // 以 true/false 形式输出 std::cout << "A is default constructible? " << std::is_default_constructible_v<A> << '\n'; std::cout << "B is default constructible? " << std::is_default_constructible_v<B> << '\n'; std::cout << "C is default constructible? " << std::is_default_constructible_v<C> << '\n'; std::cout << "int is default constructible? " << std::is_default_constructible_v<int> << '\n'; std::cout << "std::string is default constructible? " << std::is_default_constructible_v<std::string> << '\n'; return 0; }