标量在c++类型特征意义上的作用是什么?

What is the purpose of a scalar in the C++ type traits sense?

本文关键字:作用 是什么 意义上 特征 c++ 类型 标量      更新时间:2023-10-16

我已经能够在cppreference.com, cplusplus.com和这个网站(什么是c++中的标量对象?)上找到参考资料,使我能够确定特定的c++数据类型是否为标量。也就是说,我可以应用这样一个心理算法:"它是引用类型、函数类型还是void?"如果不是,它是数组、类还是联合?如果不是,它就是标量类型。"在代码中,当然,我可以应用std::is_scalar<T>。最后,我可以应用工作定义"标量类型是具有内置加法操作符功能的类型,没有重载(算术、指针、成员指针、enum和std::nullptr_t)"。

我没能找到的是标量分类的目的的描述。为什么会有人关心一个东西是不是标量呢?这似乎是一种"剩余"分类,就像动物学分类学中的"爬行动物"("爬行动物是,嗯,不是鸟或哺乳动物的羊膜动物")。我猜它一定有什么用处来证明它的混乱。我可以理解为什么有人想知道类型是否是引用——例如,您不能接受引用的引用。但是为什么人们要关心一个东西是不是标量呢?标量性是关于什么的?

给定is_scalar<T>,您可以确定operator=(), operator==()operator!=()任何 T做您认为的(即分别赋值,比较和逆)。

  • 一个class T可能有也可能没有这些,具有任意的含义;
  • a union T有问题;
  • 一个函数没有=;
  • 一个引用可能包含上述任何一个;
  • 一个数组-好吧,对于两个不同大小的数组,==!=将使其衰减为指针并进行比较,而=将在编译时失败。

因此,如果您有is_scalar<T>,您可以确保这些工作一致。否则,您需要进一步查看

目的之一是编写更有效的模板特化。在许多体系结构中,传递指向对象的指针比复制它们更有效,但是标量可以放入寄存器中,并且可以用单个机器指令复制。或者泛型类型可能需要锁定,而机器保证它将使用单个原子指令读取或更新正确对齐的标量。

在cppreference.com的注释中有线索吗?

c++内存模型中的每个单独的内存位置,包括语言特性(例如虚表指针)使用的隐藏内存位置,都具有标量类型(或者是相邻的非零长度的位域序列)。表达式求值中的副作用排序、线程间同步和依赖排序都是根据单个标量对象定义的。