考虑简单函数重载
Consideration on simple function overloading
我遇到了函数重载的问题,可能非常愚蠢和简单,但无法提出解决方案。我定义了 2 个重载函数:
void pp(int) {cout << "1";}
void pp(int&) {cout << "2";}
后来我试图打电话给他们。调用第一个很容易,例如pp(1);
临时对象不能分配给非常量引用,因此没有模糊性。但是我应该写什么来调用函数pp(int&)
?我真的不知道。编译器允许这样的重载,所以我想有一种方法可以调用这两个函数。否则,让这种超载是没有意义的。
另一个类似的问题如下所示:
void p(const int) {cout << "1";}
void p(const int&) {cout << "2";}
编译器允许这样的重载,但我不知道如何毫无歧义地调用任何函数。有什么线索吗?
编辑:这只是一个考虑它的例子,而不是在实际程序中使用它或其他东西。这里提供的代码显然很丑陋,只显示了某种问题。
主要结论应该是,程序员应该处理歧义,即使编译器允许一些重载。
始终可以使用函数的显式强制转换来覆盖重载解析:
int x = 10;
static_cast<void(&)(int&)>(pp)(x); // calls void pp(int&)
否则,实际上,调用pp(x)
是不明确的,因为绑定到引用与绑定到重载解析值具有完全相同的"匹配优先级"。如果第二次重载pp(const int &)
,则同样成立,因为"资格调整"也是"完全匹配"。
参见标准中的"标准转换序列"[over.ics.scs](例如C++11)中的13.3.3.1.1和"引用绑定"[over.ics.ref](13.3.3.1.4)。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?