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
Run Code Online (Sandbox Code Playgroud)
如果我从程序中删除unsigned,那么它工作正常.
int i = 10;
float j = 1.0;
add(i,f); // working
Run Code Online (Sandbox Code Playgroud)
为什么在重载函数中使用无符号变量会导致ambiguios调用
unsigned float在C++中没有任何东西.float总是signed
根据§7.1.5.2中的C++标准表7,"签名"本身就是"int"的同义词.
所以编译器应该给你一个错误,那个signed或unsigned不适用float.
检查这里,即使Ideone报告错误.
error: ‘signed’ or ‘unsigned’ invalid for ‘j’
Run Code Online (Sandbox Code Playgroud)
您是否有机会将此错误误解为ambiguos函数调用错误?
如果你放弃了unsigned float,编译器无法看到任何匹配函数调用具有参数unsigned int和float,所以它促进unsigned int以int解析该调用与参数的函数int和float,没有歧义.
这是Ideone上的代码示例.
在C++中,int表示它是有符号的。因此,当您使用 unsigned int 进行调用时,它会发现没有匹配的函数调用,并且它会尝试键入将 unsigned int 提升为可能发生匹配的内容,但在这里,它无法决定它的数据类型必须提升自身,因为 unsigned int 可以提升为 int 和 float。(我不确定“无符号浮点数”)