为什么这个函数调用不明确?

use*_*503 32 c++ integer integer-promotion implicit-conversion unsigned-integer

我正在阅读标准并试图弄清楚为什么没有演员表就无法解决此代码.

void foo(char c) { }

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

int main()
{
   foo(123456789); // ambiguous
   foo((unsigned long int) 123456789); // works
}
Run Code Online (Sandbox Code Playgroud)

这就是它所说的:

4.13整数转换排名[conv.rank]

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

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

- char的等级应等于signed char和unsigned char的等级.

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

AnT*_*AnT 51

它与4.13中定义的类型的等级几乎没有关系.4.13定义的内部排名用于描述整体促销和通常的算术转换.它们本身并不直接影响重载决策.与重载分辨率相关的排名在"13.3.3.1.1标准转换序列"中定义,然后用于"13.3.3.2排名隐式转换序列".

因此,它是关于13.3中定义的转换等级.123456789int您平台上的整数文字类型.这意味着,调用都charunsigned long你的函数的版本需要从隐式转换intchar或者从intunsigned long.在这两种情况下,我们都进行了"积分转换"类型的转换.这意味着在这种情况下,这两个功能同样"糟糕".因此含糊不清.

如果这些功能中的一个仅仅需要完整的促销(而不是整体转换),那么它将赢得分辨率并且该呼叫将被认为是明确的.但是你的两个功能都需要完整的转换.