【问题标题】:Do arithmetic operators have to promote integral arguments to int? [duplicate]算术运算符是否必须将整数参数提升为 int? [复制]
【发布时间】:2017-11-16 17:46:49
【问题描述】:

cppreference says:

特别是,算术运算符不接受小于 int 的类型作为参数,并且在左值到右值转换后会自动应用整数提升(如果适用)。

ab 都是short 时,所有主要编译器(g++、clang 和 msvc)saydecltype(a+b)int

但是,标准说:

Integral promotions [conv.prom]/1
boolchar16_­tchar32_­twchar_­t 以外的整数类型的纯右值,其整数转换秩小于int 的秩可以转换为int [。 ..].

Usual arithmetic conversions [expr.arith.conv]/1.5.1
-- 如果两个操作数的类型相同,则不需要进一步转换。

我只能看到“可以转换”,我找不到需要对算术运算符进行整数提升的地方。
这里的 cppreference 错了吗?

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

    你离它只有一条线。来自 [expr]/11 (N4659):

    许多期望算术或枚举类型的操作数的二元运算符会导致转换并以类似的方式产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,定义如下:

    ...

    否则,积分提升 (7.6) 应在两个操作数上执行。然后将以下规则应用于提升的操作数:

    添加了重点。 [conv.prom] 说它们可以发生以及它们是如何工作的。 [expr]/11 指定它们发生的时间之一。

    【讨论】:

    • 如果我自己可以这么说的话,这措辞有点脆弱。它说“应用了算法A”。但是,一旦我们阅读了算法,它就会根据“可能发生”而不是“应该发生”来说明。
    • @StoryTeller:对。 7.6 并没有讨论任何地方的每个整数都会发生什么。它解释了积分促销的过程,这可能发生。其他人决定何时 整数促销发生。如果你对整数使用算术,它们就会得到提升。如果您对他们使用算术,那么他们不会得到提升。这就是为什么它说“可以”,而不是“将”。
    • @StoryTeller:一个人成功漏掉了一个句子这一事实并不意味着该句子不存在或不清楚。人们会犯错误并误读事物。这并不意味着他们阅读的内容不清楚。
    • [conv.prom] 应写为“1/ 整数提升是以下转换:2/ 非整数类型的纯右值 [...] 转换为 int [...] 类型的纯右值。”不会有任何混乱。
    • @Abyx 呃,不。那措辞会很糟糕。 [conv.prom] 定义可以执行的转换。如果您使用“is”,则表示它们预制的。说“bool 类型的纯右值转换为int 类型的纯右值”意味着所有布尔纯右值都是ints。措辞很好。
    猜你喜欢
    • 2021-12-23
    • 2020-12-04
    • 1970-01-01
    • 2018-04-24
    • 2015-02-06
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多