我遇到了函数重载的问题,可能非常愚蠢和简单,但无法提出解决方案。我定义了2个重载函数:
void pp(int) {cout << "1";}
void pp(int&) {cout << "2";}
以后我试着打电话给他们。调用第一个很容易,例如pp(1);
临时对象不能分配给非const引用,因此没有ambguity。但是我应该写什么来调用函数pp(int&)
?我真的不知道。编译器允许这样的重载,所以我猜有一种方法来调用这两个函数。否则,让这种超载是毫无意义的。
另一个类似的问题如下:
void p(const int) {cout << "1";}
void p(const int&) {cout << "2";}
编译器允许这样的重载,但我不知道如何在没有歧义的情况下调用任何函数。有线索吗?
编辑: 这只是一个考虑它的例子,而不是在真实程序或其他东西中使用它。这里提供的代码显然是丑陋的,只显示出某种问题。
主要结论应该是程序员应该注意歧义,即使编译器允许一些过载。
答案 0 :(得分: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)。