C++类型

2024年10月18日 19点热度 0人点赞 0条评论
  • 基础数据类型(Fundamental Type)

    • 空类型(void): 用于表示函数不返回任何值,或用于声明 void 指针(可以指向任何类型的对象,但不能解引用)。

    • 空指针类型(std::nullptr_t c++11 ): 用于表示空指针值。

    • 整型 (Integral Type): 表示整数,包括:

      • 字符类型: char, signed char, unsigned char, wchar_t, char8_t (C++20), char16_t, char32_t。 char 的符号性由编译器决定。

      • 布尔类型: bool 可以取值为 true 或 false,底层通常以 1 和 0 表示。

      • 标准整型: short, int, long, long long 以及它们的无符号版本(unsigned short, unsigned int 等)。

    • 浮点型 (Floating-Point Type): 表示带小数部分的数字,包括 float, double, long double。

    是否是fundamental Type可以使用std::is_fundamental_v来判断

    _EXPORT_STD template <class _Ty>
    constexpr bool is_fundamental_v = is_arithmetic_v<_Ty> || is_void_v<_Ty> || is_null_pointer_v<_Ty>;
  • 标量类型(Scalar Type)

    • 算术类型(Arithmetic Type)

      • 整数类型:包括所有的整型,如 intcharboolunsigned int 等。

      • 浮点类型:包括 floatdoublelong double 等。

    • 枚举类型(Enumeration Type)

      • 枚举(enum)

      • 作用域枚举(enum class | struct)

    • 指针类型(Pointer Type):任意类型的指针类型都属于标量类型,例如 int*char*void*

    • 成员指针类型(Pointer-to-member Type):指向类的成员(数据成员或成员函数)的指针。C++ 标准将 pointer-to-member 单独分为一个类别,是因为它的语义、访问机制、以及底层实现都与普通的指针类型(即指向对象或函数的指针)有显著的不同。

    • 空指针类型(std::nullptr_t c++11)

    是否是scalar Type可以使用std::is_scalar_v来判断

    _EXPORT_STD template <class _Ty>
    constexpr bool is_scalar_v = // determine whether _Ty is a scalar type
        is_arithmetic_v<_Ty> || is_enum_v<_Ty> || is_pointer_v<_Ty> || is_member_pointer_v<_Ty> || is_null_pointer_v<_Ty>;
  • 复合类型(Compound Type)

    • 所有的非基础数据类型(Fundamental Type)都是复合类型

    • 数组、函数、类、非空指针类型指针、引用、联合体、枚举等

    是否是复合类型可以使用std::is_compound_v来判断

    _EXPORT_STD template <class _Ty>
    constexpr bool is_compound_v = !is_fundamental_v<_Ty>;
  • 标准布局类型(Standard-Layout Type)

    • 没有非标准布局类(或此类类型的数组)类型的非静态数据成员或引用

    • 没有虚函数和虚基类

    • 所有非静态数据成员在基类和派生类中必须有相同的访问控制(public、protected 或 private)

    • 没有非标准布局基类

    • 最多有一个给定类型的基类子对象(不允许菱形继承)

    • 类中的第一个非静态成员的类型与其基类不同

    • 类中的所有非静态数据成员和位字段及其基类都首先在同一个类中声明(其实就是所有非静态数据成员都要在一个类里声明)

    是否是标准布局类型可以使用std::is_standard_layout_v来判断

    _EXPORT_STD template <class _Ty>
    constexpr bool is_standard_layout_v = __is_standard_layout(_Ty);
  • 平凡可拷贝类型(Trivially Copyable Type)

    • 复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符要么是删除的,要么是简单的

    • 至少有一个未删除的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符

    • 有一个简单的、未删除的析构函数

    是否是平凡可拷贝类型可以使用std::is_trivially_copyable_v来判断

    _EXPORT_STD template <class _Ty>
    constexpr bool is_trivially_copyable_v = __is_trivially_copyable(_Ty);
  • 平凡类型(Trivial Type)

    • 是平凡拷贝类型

    • 具有一个或多个符合条件的默认构造函数,每个构造函数都是简单的

是否是平凡类型可以使用std::is_trivial_v来判断

_EXPORT_STD template <class _Ty>
constexpr bool is_trivial_v = __is_trivial(_Ty);
  • POD类型(Plain Old Data Type)

    • POD类是平凡类型(trivial class)并且是标准布局类型(standard-layout class)

    • 所有的标量类型都是POD类型

    • 通常满足以下条件

      • 没有用户定义的构造函数、析构函数、复制构造函数或移动构造函数

      • 没有虚函数和虚基类

      • 所有非静态数据成员必须是标准布局类型

是否是复合类型可以使用std::is_pod_v来判断

_EXPORT_STD template <class _Ty>
_CXX20_DEPRECATE_IS_POD constexpr bool is_pod_v = __is_pod(_Ty);
  • 聚合类型(Aggregate Type)

    • 没有用户提供的构造函数

    • 没有私有和受保护的非静态数据成员

    • 没有虚函数

    • 必须是公开的基类,不能是私有或者受保护的基类(c++17开始)

    • 必须是非虚继承(c++17开始)

是否是聚合类型可以使用std::is_aggregate_v来判断(c++17)

_EXPORT_STD template <class _Ty>
constexpr bool is_aggregate_v = disjunction_v<is_array<_Ty>, _Is_aggregate_impl<_Ty>>;

icebmji

这个人很懒,什么都没留下

文章评论