1

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

编译器允许这种重载,但我不知道如何调用任何函数而不会产生歧义。有什么线索吗?

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

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

4

1 回答 1

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

于 2013-11-09T12:46:24.117 回答