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

C++ 为什么这个函数调用不明确?,c++,integer,implicit-conversion,unsigned-integer,integer-promotion,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整数转换秩[conv.rank] 每个整数类型都定义了整数转换

我正在阅读标准,并试图弄明白为什么没有强制转换就无法解析此代码

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]

每个整数类型都定义了整数转换秩 详情如下:

-任何无符号整数类型的秩应等于 对应的有符号整数类型

-字符的秩应等于有符号字符和无符号字符的秩 查尔


特别是,让我的jimmies感到沙沙作响的是,它没有说任何无符号整数类型,只是说无符号字符。我猜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
。在这两种情况下,我们都有“积分转换”类型的转换。这意味着在这种情况下,这两种功能都同样“糟糕”。因此产生了歧义


如果其中一项职能仅仅需要整体提升(而不是整体转换),那么它将赢得决议,而这一呼吁将被认为是明确的。但遗憾的是,您的两个函数都需要整数转换。

也许123456789U可以为您做这件事。“特别是,我的jimmies没有说任何无符号整数类型,只是说无符号字符。我猜字符是通过转换提升为无符号类型的。这是真的吗?”-我敢说你误解了标准中4.13的重要性
char
未升级为未签名的
。。。问题是,正如AndreyT所说,123456789是一个
int
,将其截断为
char
或将其传递为
无符号长
long
同样糟糕-
无符号
在这里并不重要)。尽管名称不同,“整数转换秩”在重载解析期间,实际上不用于对整数转换进行排序。这两种转换都不安全——一种是有符号到无符号的,另一种是较大类型到较小类型的——那么为什么一种不安全的操作要胜过另一种呢?+1表示“沙沙作响我的jimmies”,或者,另一种看法是:函数调用重载不区分
123456789
-123456789
,两者都是
int
s。将
-123456789
转换为
无符号长
可能会丢失数据:因此,一般来说,从
int
转换为
无符号长
可能会丢失数据。
char
也是如此。现在,使用特定常数
123456789
可以证明它不会丢失,但是重载规则没有考虑到这一点:系统上
123456789
的类型是
int
,因此
int
用于进行重载解析。