我正在阅读标准并试图弄清楚为什么没有强制转换就无法解析这段代码。
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 Integer conversion rank [conv.rank]
Every integer type has an integer conversion rank defined as follows:
— The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type.
— The rank of char shall equal the rank of signed char and unsigned char.
特别是,让我的小伙伴们感到不安的是,它没有说任何无符号整数类型,只是无符号字符。我的猜测是 char 通过转换被提升为无符号类型。这是真的吗?
最佳答案
它与 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
。在这两种情况下,我们都有“积分转换”类型的转换。这意味着在这种情况下,这两个功能同样“糟糕”。因此模棱两可。
如果其中一个函数只需要积分 promotion(与积分 conversion 相对),它将赢得决议,并且调用将被认为是明确的。但是很遗憾,您的两个函数都需要完整的转换。
关于c++ - 为什么这个函数调用不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26010806/