c++ - 关于函数重载的查询

标签 c++ function overloading literals

当使用同名函数时,参数列表必须不同(参数类型或使用的参数数量)。我只是在练习这个概念。我写了下面的代码。

   #include <iostream> 
    int myFunction(int n)
   { 
    return 2*n;
   }
    float myFunction(float n)
   { 
    return 3*n;
   }
    int main()
   {
    int x=myFunction(3);
    std::cout << x; 
    return 0;
   }  
    

我以为我会得到错误,因为编译器会混淆使用哪个 myFunction,因为我直接传递值 3 而没有将它存储在特定类型的变量中。但是我得到了输出 6。所以我尝试了以下代码。

   #include <iostream> 
    int myFunction(int n)
   { 
    return 2*n;
   }
    float myFunction(float n)
   { 
    return 3*n;
   }
    int main()
   {
    float x=myFunction(3.3);
    std::cout << x; 
    return 0;
   }  
    

因为前一个工作正常,我认为这也可以工作,因为 3.3 不是整数,所以很清楚调用哪个,但这次我得到编译器错误,说它不明确。

所以我怀疑为什么第一个代码有效但第二个代码无效。

最佳答案

调用过程中选择重载的过程称为overload resolution .给定参数类型,编译器选择 best viable function来自候选列表 - 可以用最少数量的促销和隐式转换调用的候选列表。

在第一种情况下,第一个 myFunction(int) 需要对 int 参数 (3) 进行 0 次转换,而第二个需要一次转换(int -> float),因此选择第一个作为最佳候选者。

在第二种情况下,double 参数 (3.3) 需要转换为 intfloat,所以没有明确的赢家,因此这个决定是模棱两可的。

修复可能是使用 float 参数 (3.3f) 或将 myFunction(float) 更改为 myFunction(double )

关于c++ - 关于函数重载的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63086806/

相关文章:

javascript - 我无法使用 .filter() 方法来过滤正确的索引

带有泛型重载的 Java 删除(不是覆盖)

Java:重载方法解析

c++ - 使用 WMI (c++) 枚举工作组中的 pc

c++ - 代码在 Linux 上运行良好,但在 Windows 操作系统上提供不同的输出

c++ - 超出范围后传递给构造函数的值发生了什么?

javascript - 当用户试图离开页面时,如何执行 javascript 函数?

c++ - 函数模板内的 decltype 和范围解析运算符

C - 在函数中写入字符串。错误 :expected expression

c++ - 重载类成员函数