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我注意到虽然它编译,但它不会运行,报告模糊性的运行时错误.
从广义上讲,功能可以在以下基础上超载:
该示例编译因为它满足第二个标准.
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)
以上情况会导致编译器产生歧义,因为编译器无法检测到两个函数调用之间的最佳匹配.