#include <iostream>
#include <cmath>
using namespace std;
float f (int a, int b) {
return (a + b);
}
float f (float a, float b) {
return (round(a + b));
}
int main ()
{
cout << "Hello World!" << endl;
int int1 = 1;
int int2 = 2;
float float1 = 1.2f;
float float2 = 1.4f;
cout << f(int1, int2) << endl; // output: 3
cout << f(float1, float2) << endl; // output: 2
cout << f(int1, float2) << endl; // output: 2
return 0;
}
为什么最后一个输出使用f
的第二个定义?
一般来说,当函数定义和函数调用之间的参数的数量和类型没有完全匹配时,如何确定将使用哪个重载函数定义?
答案 0 :(得分:4)
在尝试在标准中确定为什么一个重载优先于另一个之后我得出结论它不应该,在f( int1, float2 )
和conv.cpp:22: error: call of overloaded ‘f(int&, float&)’ is ambiguous
conv.cpp:5: note: candidates are: float f(int, int)
conv.cpp:9: note: float f(float, float)
的情况下,没有过载具有比另一个更好的转换序列。代码不应该编译。如果您的编译器正在接受它,那么实现中可能存在错误。
从第二个问题开始,标准定义了可用于匹配函数调用的转换,并且还为那些用作部分排序的转换定义了 rank (称为< em>比更好的转换。编译器将始终选择最佳转换,如果没有最佳转换,则程序生成错误,如示例所示。
使用不同的编译器验证代码的模糊性:
GCC
conv.cpp:22:13: error: call to 'f' is ambiguous
cout << f(int1, float2) << endl; // output: 2
^
conv.cpp:5:7: note: candidate function
float f (int a, int b) {
^
conv.cpp:9:7: note: candidate function
float f (float a, float b) {
^
铛:
error C2666: 'f' : 2 overloads have similar conversions
src\main.cpp(2): could be 'void f(int,int)'
src\main.cpp(1): or 'void f(float,float)'
while trying to match the argument list '(int, float)'
MSVS 2010(感谢Xeo):
{{1}}
答案 1 :(得分:0)
您需要知道的更多内容:http://www.learncpp.com/cpp-tutorial/76-function-overloading/
基本上选择了第二个,因为如果不可能完全匹配并且无法通过促销匹配,则通过转换(从int
到float
的第一个参数)进行匹配。< / p>
答案 2 :(得分:0)
简单来说,如果您将int
转换为float
,则不会丢失任何信息;如果您将float
转换为int
,则会丢失该数字的小数部分。如果编译器找不到精确的重载匹配,它将选择导致信息丢失最少的那个。