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中定义的转换等级.123456789
是int
您平台上的整数文字类型.这意味着,调用都char
和unsigned long
你的函数的版本需要从隐式转换int
到char
或者从int
到unsigned long
.在这两种情况下,我们都进行了"积分转换"类型的转换.这意味着在这种情况下,这两个功能同样"糟糕".因此含糊不清.
如果这些功能中的一个仅仅需要完整的促销(而不是整体转换),那么它将赢得分辨率并且该呼叫将被认为是明确的.但是你的两个功能都需要完整的转换.