我已经能够在cppreference.com,cplusplus.com和这个网站(What is a scalar Object in C++?)上找到参考资料,这使我能够确定特定的C ++数据类型是否是标量。也就是说,我可以运用这样运行的心理算法:“它是引用类型,函数类型还是void?如果不是,它是数组,类还是联合?如果不是,它是标量类型。”当然,在代码中,我可以应用std::is_scalar<T>
。最后,我可以应用工作定义“标量类型是一种具有内置功能的类型,用于加法运算符而不会重载(算术,指针,成员指针,枚举和std :: nullptr_t)。”
我无法找到的是对标量分类的目的的描述。为什么有人会关心某些东西是标量?它似乎是一种“剩余”分类,就像动物分类学中的“爬行动物”一样(“嗯,爬行动物是,嗯,不是鸟或哺乳动物的羊膜)”。我猜它必须有一些用来证明它的混乱。我可以理解为什么有人想知道类型是否是引用 - 例如,你不能引用引用。但是为什么人们会关心某些东西是否是标量?什么是标量?
答案 0 :(得分:3)
鉴于is_scalar<T>
,您可以确定operator=()
,operator==()
和operator!=()
符合您的想法(即分配,比较及其相反的分别) ) any T
。
class T
可能有也可能没有任何这些,具有任意意义; union T
有问题; =
; ==
和!=
,它会使它衰减到指针并进行比较,而=
将失败编译时。因此,如果您有is_scalar<T>
,则可以确保这些工作始终如一。否则,你需要进一步了解。
答案 1 :(得分:1)
一个目的是编写更有效的模板特化。在许多体系结构中,传递指向对象的指针比复制它们更有效,但是标量可以适合寄存器并使用单个机器指令进行复制。或者泛型类型可能需要锁定,而机器保证它将使用单个原子指令读取或更新正确对齐的标量。
答案 2 :(得分:0)
cppreference.com上的说明中提到了线索?
C ++内存模型中的每个单独的内存位置,包括语言功能使用的隐藏内存位置(例如虚拟表指针),具有标量类型(或者是非零长度的相邻位域序列)。 表达式评估,线程同步和依赖性排序中的副作用排序都是根据单个标量对象定义的。