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;
}
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/m0_73457176/article/details/164183590



