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

时间:2011-01-09 17:24:06

标签: c++ implicit-conversion integer-promotion

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

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

  

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

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

P.S。我正在阅读标准的C ++ 03版本。

2 个答案:

答案 0 :(得分: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));
}
  • shortint是促销(因此具有促销排名)
  • shortunsigned short是转化(因此具有转换排名)

最后,此代码调用foo(int),因为它是更好的候选者。

答案 1 :(得分:4)

促销在算术和其他操作期间发生。仅将一个整数类型存储在另一个整数类型中时会发生转换。