C++中的标量对象是什么?

40

就我理解,基本类型是标量,而数组是聚合的,但用户定义的类型呢?以什么标准将它们划分为这两个类别?

struct S { int i; int j };
class C { public: S s1_; S s2_ };
std::vector<int> V;
std::vector<int> *pV = &v;

我认为你可能想要清理一下引言段落的拼写和语法,如果你想得到有用的答案,可能还需要稍微扩展一下它。 - tletnes
你是指“类型”和“聚合”吗? - us2012
2
@us2012:“Tapes and Arrogates”应该是一支独立的大学乐队。 - Kerrek SB
3个回答

52

简短版: C++中的类型有:

  • 对象类型:标量、数组、类、联合

  • 引用类型

  • 函数类型

  • (成员类型) [见下文]

  • void


详细版

  • 对象类型

    • 标量

      1. 算术类型(整型、浮点型)

      2. 指针:T *,其中T为任意类型

      3. 枚举

      4. 指向成员的指针

      5. nullptr_t

    • 数组:T[]T[N],其中T为任意完整、非引用类型

    • 类:class Foostruct Bar

      1. 平凡类

      2. 聚合体

      3. POD类

      4. (等等)

    • 联合:union Zip

  • 引用类型:T &T &&,其中T为任意对象或自由函数类型

  • 函数类型

    • 自由函数:R foo(Arg1, Arg2, ...)

    • 成员函数:R T::foo(Arg1, Arg2, ...)

  • void

成员类型的使用方法如下。成员类型的形式为T::U,但您不能有成员类型的对象或变量。您只能有成员指针。如果U是(自由)对象类型,则成员指针的类型为T::* U,如果U是(自由)函数类型,则成员指针为指向成员函数的指针。

void、未定大小的数组和已声明但未定义的类和联合外,所有类型均为完整的。除void外的所有不完整类型都可以完成。

所有类型都可以被const/volatile修饰。

<type_traits>头文件提供了特征类来检查每种类型特征。


你的浮点数值分解列表可能是错误的,例如浮点数和双精度浮点数不是标量类型。非标量类型包括浮点数、双精度浮点数以及向量类型,如__m128、__m128i、__m128d将返回在XMM0中。https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160&viewFallbackFrom=vs-2017 - metablaster

41

我认为这会是一个更全面的答案:

输入图像描述

原始文件:
http://howardhinnant.github.io/TypeHiearchy.pdf

标量是一种基本类型,但不能是void,但可以是指针类型或枚举类型。

而且基本类型在语言中有关键词。这样说起来很容易识别。


8
有一系列库类用于测试变量的类型。可以使用std::is_scalar来测试一个对象是否为标量。

标量类型是指具有内置加法运算符功能且没有重载(算术、指针、成员指针、枚举和std::nullptr_t)的类型。

此外,还有来自这里的一个表格。

C++类型类别


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接