【发布时间】:2016-09-02 22:08:27
【问题描述】:
我已经能够在 cppreference.com、cplusplus.com 和此站点 (What is a scalar Object in C++?) 上找到参考资料,这些资料使我能够确定特定 C++ 数据类型是否为标量。也就是说,我可以应用这样运行的心理算法:“它是引用类型、函数类型还是 void?如果不是,它是数组、类还是联合?如果不是,它是标量类型。”当然,在代码中,我可以申请std::is_scalar<T>。最后,我可以应用工作定义“标量类型是一种具有加法运算符的内置功能而没有重载(算术、指针、成员指针、枚举和 std::nullptr_t)的类型。”
我找不到的是对标量分类的用途的描述。为什么有人会关心某个东西是否是标量?这似乎是一种“剩余”分类,就像动物分类学中的“爬行动物”(“嗯,爬行动物是,嗯,一种羊膜动物,不是鸟类或哺乳动物”)。我猜它一定有一些用途来证明它的混乱。我可以理解为什么有人想知道一个类型是否是一个引用——例如,你不能引用一个引用。但是为什么人们会关心某个东西是否是标量呢?什么是标量?
【问题讨论】:
-
@JoachimPileborg:我认为 Alan 明白标量的含义,问题是:如果类型是标量,我会在我真正关心的地方编写什么(可能是模板化的)代码?我猜
is_scalar的存在是为了完整性,而不是出于任何激励用例,但也许其他人可以肯定地说。 -
也许是为了编写更高效的模板代码:传递指向更复杂类型的指针可能比复制它们更快,或者您可能需要锁来实现对它们的原子操作,但是大多数架构,您可以将正确对齐的标量存储在寄存器中,并将其作为原子硬件指令读取或更新。
-
具有类型特征的事情是它们不是孤立使用的,或者当某事物的类型已知时。它们主要用于模板元编程和 SFINAE,例如根据模板参数的类型选择特定的函数。如果您需要对“具有加法运算符的内置功能且没有重载的类型(算术、指针、成员指针、枚举和 std::nullptr_t)”的类型进行一些专门化,那么
std::is_scalar是正确的函数使用。 -
@Lorehead,如果该评论是一个答案,我会投赞成票。
-
@Alan 好的,你去吧。
标签: c++