c++ - 函数重载 - 传递常量与传递变量 C++

标签 c++ overloading

#include <iostream>

using namespace std;

void somefunc(int a)
{
    cout<<"somefunc1";
}

void somefunc(int &b)
{
    cout<<"somefunc2";
}

int main()
{

    // case 1 
    somefunc(10); // works fine and prints somefunc1

   //case2
    int b=10;
    somefunc(b); // generates compiler error that overloading is ambiguous 

   return 0;
}

main() 中,如果我传递一个常量(例如 10),程序会编译并运行并打印 "somefunc1",但是当我传递一个变量(在本例中为 b)编译器会生成一个错误,指出重载不明确。

我不明白它在内部是如何工作的。 请帮忙!!

最佳答案

重载决议的规则有点复杂。这是一种简化,适用于此特定示例。

编译器的第一步是找到“重载集”,即可以用参数调用的函数集。对于somefunc(10),只能调用somefunc(int);无法调用 somefunc(int&),因为 10 是常量,不能通过(非常量)引用传递。所以重载集中只有一个函数,也就是被调用的函数。

对于somefunc(b),两个函数都可以被调用。所以重载集有两个函数,somefunc(int)somefunc(int&)。现在编译器必须确定哪个函数是参数 10 的“最佳匹配”。规则是 intint& 都提供“精确匹配”,因此规则不会优先于另一个,并且调用不明确。

如果函数的第二个版本是 somefunc(const int&) 而不是 somefunc(int&) 调用 somefunc(10)也会有歧义。

关于c++ - 函数重载 - 传递常量与传递变量 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250025/

相关文章:

c++ - 如果条件不起作用怎么办?

c++ - 大数乘法取模

c++ - 基于值与常量引用的函数重载

C++ <type>*& 类函数或结构错误

c++ - Qt GLSL纹理只出现一种颜色

java - 工厂方法重载

c++ - 如何为枚举重载 << 运算符

programming-languages - 按返回类型重载函数?

c# - 如何在没有歧义的情况下调用具有可选参数的重载方法?

c++ - std::string 数组元素访问