6

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.7.4 涵盖了 4.5.4。那么整个 4.5 部分的目的是什么?它启用了哪些额外的转换?也许我错过了一些限制?

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

4

2 回答 2

9

认为区别很重要,因为两者不属于同一转换类别并且具有不同的等级(请参阅 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));
}
  • shorttoint是一个提升(因此具有提升等级)
  • shorttounsigned short是转换(因此具有转换等级)

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

于 2011-01-09T17:45:36.993 回答
5

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

于 2011-01-09T17:31:14.870 回答