C++如何指定调用含传值/引用/const参数的同名重载函数
C++重载函数调用歧义的解决方法
歧义原因分析
你的四个重载函数中存在几个关键问题,导致调用时编译器无法确定匹配哪个:
- 对于右值调用
SomeFunction(5);:函数1(值传递)、函数3(const左值引用,C++11起右值可绑定到const左值引用)、函数4(const值传递)都是可行匹配,引发歧义。 - 对于非const左值
int x=5; SomeFunction(x);:函数1、2(非const左值引用)、3、4都能匹配,同样产生歧义。 - 额外注意:函数1和函数4属于重复定义——C++中函数参数的顶层const不影响函数签名,
void SomeFunction(int)和void SomeFunction(const int)会被编译器视为同一个函数,根本无法通过编译,所以函数4本身就不合法。
如何指定调用目标重载
非模板重载无法用SomeFunction<...>这种模板特化语法指定,必须通过强制类型转换或显式函数指针绑定来明确:
1. 调用SomeFunction(5)时指定目标
- 调用函数1(int值传递):
// 强制转换为int(明确匹配值传递) SomeFunction(static_cast<int>(5)); // 或用函数指针锁定签名 void (*func_ptr)(int) = SomeFunction; func_ptr(5); - 调用函数3(const int&):
// 将右值绑定到const左值引用后传递 const int& temp = 5; SomeFunction(temp); // 或用函数指针 void (*func_ptr)(const int&) = SomeFunction; func_ptr(5);
2. 调用SomeFunction(x)(x为非const左值)时指定目标
- 调用函数2(int&):
// 用函数指针锁定非const引用签名 void (*func_ptr)(int&) = SomeFunction; func_ptr(x); // 或强制转换为int& SomeFunction(static_cast<int&>(x)); - 调用函数3(const int&):
// 强制转换为const左值引用 SomeFunction(static_cast<const int&>(x)); // 或用函数指针 void (*func_ptr)(const int&) = SomeFunction; func_ptr(x); - 调用函数1(值传递):
SomeFunction(static_cast<int>(x)); // 或用函数指针 void (*func_ptr)(int) = SomeFunction; func_ptr(x);
关于函数共存的疑问
- 函数1和2是可以共存的,但传递非const左值时会触发歧义;传递右值时只会匹配函数1(因为右值无法绑定到非const左值引用)。
- 函数3和4无法共存——因为函数4和函数1是重复定义,编译器会直接报错,不存在“单独指定调用”的前提。
内容的提问来源于stack exchange,提问作者DannyBoy
相关产品推荐
相关产品推荐

