3
#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
    int s = 2;
    unsigned int u = 3;

    auto k = s + u;

    if (typeid(k) == typeid(s))
        cout << "signed" << endl;
    else if (typeid(k) == typeid(u))
        cout << "unsigned" << endl;
    else
        cout << "error" << endl;
}

GCC 的这个程序的输出是:

unsigned

我很确定这是未定义或实现定义的行为 - 但我似乎无法将这些点与标准联系起来。

你能告诉我它在标准中的哪个地方这么说吗?

4

1 回答 1

11

您所看到的只是通常算术转换的效果。

该标准规定如下:

§5 [expr] p7

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

  • [...]
  • 否则,应在两个操作数上执行积分提升 (4.5)。然后将以下规则应用于提升的操作数:
    • [...]
    • 否则,两个操作数都应转换为与带符号整数类型的操作数类型对应的无符号整数类型。
于 2013-03-09T19:18:46.843 回答