重载函数传引用与传值时调用歧义原因及定义无报错疑问
问题
我重载了函数f,在source.h中声明两个版本:void f(int&);和void f(int);,即一个接受int&类型(传引用)参数,另一个接受int类型(传值)参数。
在source.cpp中完成函数定义:
void f(int& a){ a + 1; } void f(int a){ a + 1; }
在main函数中编写代码:
int main() { int a = 1; int& b = a; f(b); }
此时clang-tidy检测出“Call to f is ambiguous”(调用f存在歧义)的问题。我的疑问:int&和int是不同类型吗?若是,为何函数定义时编译器未检测出问题?
解答
int&和int确实是不同类型,但调用时的歧义根源在于参数匹配的优先级相同:
当传递int&类型的变量b时,调用void f(int&)是直接绑定引用,无需类型转换;调用void f(int)则是将引用指向的对象拷贝为int值,这属于隐式的身份转换(引用类型可以直接转换为对应的基础值类型)。这两个匹配路径的优先级完全一致,编译器无法判定你想调用哪个版本,因此报歧义。- 函数定义时编译器不报错,是因为这两个函数的签名符合重载规则:重载只要求函数的参数列表(类型、数量、顺序)存在差异,这里一个参数是
int&,一个是int,类型明确不同,属于合法的函数重载,所以编译器允许定义这两个函数。
内容的提问来源于stack exchange,提问作者Ivannpy
相关产品推荐
相关产品推荐

