深入理解C++ std::is_default_constructible_v std::is_default_constructible_v是 C17 引入的一个类型特性type trait用于在编译期判断某个类型是否可以被默认构造即能否通过T()或new T()的形式创建对象。它是一个变量模板等价于std::is_default_constructibleT::value使用起来更简洁。核心规则若类型T存在一个有效的默认构造函数包括编译器自动生成的、用户显式定义的、或者所有成员都有默认初始值且无用户提供构造函数等情况则std::is_default_constructible_vT为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_vA \n; std::cout B is default constructible? std::is_default_constructible_vB \n; std::cout C is default constructible? std::is_default_constructible_vC \n; std::cout int is default constructible? std::is_default_constructible_vint \n; std::cout std::string is default constructible? std::is_default_constructible_vstd::string \n; return 0; }