为什么编译器可以通过引用传递和传递值来重载函数

use*_*047 13 c++ overloading reference function

我认为在重载期间,编译器会检查形式参数是否属于同一类型.例如:

void a(int x)
void a(double x)
Run Code Online (Sandbox Code Playgroud)

因为两个"x"具有差异类型,所以可以过载.

但是,以下两种是否有不同的类型?

void f(int y)
void f(int& y)
Run Code Online (Sandbox Code Playgroud)

我知道一个是PBV和另一个PBR.但第二个y的类型是"int"也是对的吗?为什么编译成功?

PS我注意到虽然它编译,但它不会运行,报告模糊性的运行时错误.

Alo*_*ave 8

从广义上讲,功能可以在以下基础上超载:

  • 参数数量
  • 参数类型
  • 参数序列

该示例编译因为它满足第二个标准.
int并且int &是不同的数据类型.


请考虑以下示例:

void foo(int i);
void foo(int& i);
void foo(int i){}
void foo(int& i){}
int main()
{
     return 0;
}  
Run Code Online (Sandbox Code Playgroud)

上面的代码编译,因为它是有效的代码.根据传递给函数的函数参数,编译器可能/可能不会检测函数调用的最佳匹配.因此,允许函数本身共存,但它们在某些方面的使用可能会导致编译器的模糊性.

例如:在下面的代码中,文字不能绑定到非const引用,因此函数调用的唯一候选者是非引用版本,这应该编译并正常工作:

void foo(int i);
void foo(int& i);
void foo(int i){}
void foo(int& i){}
int main()
{
    foo(20); 
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

但,

void foo(int i);
void foo(int& i);
void foo(int i){}
void foo(int& i){}
int main()
{
    int i = 10;
    foo(i);
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

以上情况会导致编译器产生歧义,因为编译器无法检测到两个函数调用之间的最佳匹配.