关于简单函数重载的思考

时间:2013-11-09 12:30:24

标签: c++

我遇到了函数重载的问题,可能非常愚蠢和简单,但无法提出解决方案。我定义了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";}

编译器允许这样的重载,但我不知道如何在没有歧义的情况下调用任何函数。有线索吗?

编辑: 这只是一个考虑它的例子,而不是在真实程序或其他东西中使用它。这里提供的代码显然是丑陋的,只显示出某种问题。

主要结论应该是程序员应该注意歧义,即使编译器允许一些过载。

1 个答案:

答案 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)。