超载是模棱两可的 我正在做一些C++面试问题(为了好玩)。我发现:

超载是模棱两可的 我正在做一些C++面试问题(为了好玩)。我发现:,c++,c++11,C++,C++11,根据C++11标准,这个程序的输出是什么 #include <iostream> void f(int){std::cout << 1;} void f(unsigned){std::cout << 2;} int main() { f(-2.5); } #包括 void f(int){std::cout很好。您正在尝试使用浮点数调用函数。。。 尝试使用整数值。。。 如果使用f(-2)而不是f(-2.5),则该程序将正常工作,但正如所指出的,“除非添

根据C++11标准,这个程序的输出是什么

#include <iostream> 

void f(int){std::cout << 1;}
void f(unsigned){std::cout << 2;}

int main()
{
 f(-2.5);
}
#包括

void f(int){std::cout很好。您正在尝试使用浮点数调用函数。。。 尝试使用整数值。。。 如果使用
f(-2)
而不是
f(-2.5)
,则该程序将正常工作,但正如所指出的,“除非添加额外的限定符,否则整数文本始终是
int
”。
他的意思是,即使使用f(-2),也会得到与f(2)相同的结果…这显然使重载无效。

-2.5
是一个
双精度
,而不是有符号的
int
。编译器可以进行任何一种转换。为什么它会选择其中一种呢?
-2.5
双精度
类型。到
int
无符号的
的转换都是同样有效的语言规则下的id(即编译器没有理由选择其中一个而不是另一个)。因此,选择要调用的函数会产生歧义。@Peter对于重载解析排序,转换的排序是相等的。在其他规则下,将
-2.5
转换为
无符号
无效(浮点到整数的规则)但在重载解析阶段没有考虑到这一点。@IgorTandetnik当然!我很惭愧…奇怪,
f(2)
将产生相同的输出。除非您添加额外的限定符,否则整数文本始终为
int
。@MSalters它并不含糊。答案经过编辑,用于建议
f(-2)
起作用了,我要指出的是,使用正整数或负整数并不重要。一旦删除,我的评论就断章取义了。