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
用于进行重载解析。