C++中整数提升和整数转换之间的区别是什么

5 c++ integer-promotion implicit-conversion

C++标准的第4.5节(整数提升)讨论了将整数类型转换为具有更高排名的类型的特定情况.

C++标准的第4.7节(整数转换)以(bullet 4.7.1)开头:

整数类型的右值可以转换为另一个整数类型的右值.枚举类型的右值可以转换为整数类型的右值.

据我所知,4.5中描述的转换(可能除了子弹4.5.3(枚举))可以使用4.7节中的技术来执行:4.5.1和4.5.2完全由4.7.1涵盖; 4.5.4涵盖4.5.4.那么整个4.5节的目的是什么?它启用了哪些额外的转换?也许我错过了一些限制?

PS我正在阅读标准的C++ 03版本.

ice*_*ime 8

认为这种区别很重要,因为它们不属于同一个转换类别并且具有不同的等级(参见13.3.3.1.1,标准转换序列).在重载解析方面,排名有所不同:

标准转化顺序按其排名排序:完全匹配是比促销更好的转化,这是一种比转化更好的转化.

最后,我认为4.5和4.7之间的区别使得以下代码明确:

#include <iostream>

void foo(int i)            { std::cout << "foo(int)" << std::endl; }
void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; }

int main()
{
    foo(static_cast<short>(1));
}
Run Code Online (Sandbox Code Playgroud)
  • shortint是(因此具有促进秩)促销
  • shortto unsigned short是转换(因此具有转换级别)

最后,这段代码调用foo(int)是因为它是一个更好的候选者.


Pup*_*ppy 5

提升发生在算术和其他操作期间。当仅将一种整数类型存储在另一种整数类型中时,就会发生转换。

  • @buratinas:a 被提升为无符号整数,b 被提升为有符号整数,然后将 b 提升的结果转换为无符号整数,然后将这些相加并将结果转换为有符号短整数。 (2认同)
  • 不过,这里有一点,算术操作可以导致转换和提升,以便将类型强制在一起。再举一个例子:`unsigned int u = 2; 国际我= 2; 你+我;`。`i` 被*转换*(未提升)为 `unsigned`。 (2认同)