You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重载函数传引用与传值时调用歧义原因及定义无报错疑问

问题

我重载了函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:22:08