32

我正在阅读标准并试图弄清楚为什么如果没有演员表就无法解析这段代码。

void foo(char c) { }

// Way bigger than char
void foo(unsigned long int) { }

int main()
{
   foo(123456789); // ambiguous
   foo((unsigned long int) 123456789); // works
}

它是这样说的:

4.13 整数转换秩[conv.rank]

每个整数类型都有一个整数转换等级,定义如下:

— 任何无符号整数类型的等级应等于相应有符号整数类型的等级。

— char 的等级应等于signed char 和unsigned char 的等级。

特别是,让我的 jimmies 沙沙作响的是,它没有说任何无符号整数类型,只是无符号字符。我的猜测是 char 通过转换被提升为无符号类型。这是真的?

4

1 回答 1

52

它与 4.13 中定义的类型的等级关系不大。4.13 定义了用于描述积分提升和常用算术转换的内部排名。它们本身并不直接影响重载决议。与重载解决相关的排名在“13.3.3.1.1 标准转换序列”中定义,然后在“13.3.3.2 排名隐式转换序列”中使用。

因此,它与 13.3 中定义的转换等级有关。是您平台123456789上类型的整数文字。int这意味着调用函数的两个版本char和版本需要从to或 from tounsigned long的隐式转换。在这两种情况下,我们都有“积分转换”类型的转换。这意味着在这种情况下,这两个功能同样“糟糕”。因此模棱两可。intcharintunsigned long

如果其中一个函数只需要积分提升(与积分转换相反),它将赢得决议,并且调用将被认为是明确的。但是很遗憾,您的两个函数都需要整数转换

于 2014-09-24T07:32:19.083 回答