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

时间:2013-03-09 19:12:41

标签: c++ c++11 language-lawyer

#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

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

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

1 个答案:

答案 0 :(得分:11)

您所看到的只是Usual Arithmetic Conversions的效果。

标准说明如下:

§5 [expr] p7

  

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

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