m0_73457176头像
关注

深入理解C++ std::is_default_constructible_v

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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--