C++ 11类型(签名+无符号)?

And*_*zos 3 c++ language-lawyer c++11

#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;
}
Run Code Online (Sandbox Code Playgroud)

GCC的这个项目的输出是:

unsigned
Run Code Online (Sandbox Code Playgroud)

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

你能告诉我它在标准中的位置吗?

Xeo*_*Xeo 11

你所看到的只是通常的算术转换的影响.

标准说明如下:

§5 [expr] p7:

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

  • [...]
  • 否则,应对两个操作数执行整体促销(4.5).然后,以下规则应适用于提升的操作数:
    • [...]
    • 否则,两个操作数都应转换为与带符号整数类型的操作数类型相对应的无符号整数类型.