据我了解,基本类型是标量,数组是聚合的,但是用户定义的类型呢?我会根据什么标准将它们分为两类?
struct S { int i; int j };
class C { public: S s1_; S s2_ };
std::vector<int> V;
std::vector<int> *pV = &v;
简短版本: C++ 中的类型是:
对象类型:标量、数组、类、联合
引用类型
函数类型
(会员类型)[见下文]
void
长版
对象类型
标量
算术(整数,浮点数)
指针:T *
适用于任何类型T
枚举
指向成员的指针
nullptr_t
数组:T[]
或T[N]
任何完整的非引用类型T
类:class Foo
或struct Bar
琐碎的课程
骨料
POD 课程
(等等等等)
工会:union Zip
引用类型:T &
,T &&
对于任何对象或自由函数类型T
函数类型
免费功能:R foo(Arg1, Arg2, ...)
成员函数:R T::foo(Arg1, Arg2, ...)
void
成员类型是这样工作的。成员类型的形式为T::U
,但您不能拥有成员类型的对象或变量。你只能有成员指针。成员指针具有 type ,如果是(自由)对象类型,T::* U
则它是指向成员对象的指针,如果是(自由)函数类型,则它是指向成员函数的指针。U
U
void
除了未定义大小的数组和声明但未定义的类和联合之外,所有类型都是完整的。除了void
可以完成的所有不完整类型。
所有类型都可以const
/volatile
合格。
标<type_traits>
头提供了 trait 类来检查这些类型特征中的每一个。
我认为这将是一个更全面的答案:
原始文档:
http ://howardhinnant.github.io/TypeHiearchy.pdf
标量是基本的,但它不能为 void,但它可以是指针类型或枚举类型。
并且一个基本的语言中有一个关键字。这么说很容易辨认。
有一系列用于测试变量类型的库类。 std::is_scalar
可用于测试对象是否为标量。
标量类型是一种具有加法运算符的内置功能而没有重载(算术、指针、成员指针、枚举和
std::nullptr_t
)的类型。
还有一张来自这里的桌子。