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

标签 c++ integer implicit-conversion unsigned-integer integer-promotion

我正在阅读标准并试图弄清楚为什么没有强制转换就无法解析这段代码。

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 类型的整数文字。这意味着调用函数的 charunsigned long 版本需要从 intchar 的隐式转换或从 intunsigned long。在这两种情况下,我们都有“积分转换”类型的转换。这意味着在这种情况下,这两个功能同样“糟糕”。因此模棱两可。

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

关于c++ - 为什么这个函数调用不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26010806/

相关文章:

c++ - 编译器会内联没有主体的函数吗?

javascript - 如何检查字符串是否有超过 1 个整数(以逗号分隔)

c++ - 调用重载运算符失败时用户定义的枚举类隐式转换

c++ - 将 int 分配给 short (gcc) 时没有警告

c++ - 在 C++ 中结合正则表达式

c++ - C++仿函数行为

c++ - 在没有同步的情况下读取正在同时递增的 int 是否安全

python - .join() 在 python 中给出返回列表

c++ - 为什么这些重载函数调用不明确?

c++ - C++ 中指针和引用的问题