void add(int,int);
void add(int ,float);
void add(float,int);
unsigned int i = 10;
unsigned float j = 1.0;
add(i,f); // ambiguios call error
如果我从程序中删除unsigned,那么它工作正常。
int i = 10;
float j = 1.0;
add(i,f); // working
为什么在重载函数中使用无符号变量会导致ambiguios调用
答案 0 :(得分:7)
C ++中没有任何名为unsigned float
的东西。 float
始终为signed
根据§7.1.5.2中的C ++标准表7,“签名”本身是“int”的同义词。
因此,编译器应该给您一个错误,signed
或unsigned
不适用于float
。
检查here,即使Ideone报告错误。
error: ‘signed’ or ‘unsigned’ invalid for ‘j’
您是否有机会将此错误误解为ambiguos
函数调用错误?
如果删除unsigned float
,编译器将看不到任何具有参数unsigned int
&的匹配函数调用。 float
,因此它将unsigned int
提升为int
,并使用参数int
&解析对函数的调用。 float
,没有歧义。
Here是Ideone上的代码示例。
答案 1 :(得分:1)
调用是不明确的,因为没有任何功能签名匹配(由于查找签名值),如果它开始投射,那么它可以匹配多个签名,因此它不知道你想要的。为无符号值添加重载以避免混淆。 (不太确定unsigned float!)
答案 2 :(得分:0)
在C ++中,int表示它已签名。因此,当您使用unsigned int调用时,它会发现没有匹配的函数调用,并且它尝试将unsigned int类型键入可能发生匹配的内容,但是在这里,它无法决定它是哪种数据类型必须提升自己,因为unsigned int可以被提升为int和float。 (我不确定那个“无符号浮动”)
答案 3 :(得分:0)
在C ++中,unsigned float被视为unsigned int,并且小数部分被截断。因此,当你调用add(i,f)时,它没有匹配的功能。