当没有歧义时,是否允许通过引用进行函数重载?

时间:2015-07-16 12:21:27

标签: c++ overloading pass-by-reference language-lawyer

请考虑以下代码:

#include <iostream>

void foo(int m);
void foo(int &k);

int main()
{
    foo(5); // ok, because there is no ambiguity

    int m = 5;
    //foo(m); // compile-time error, because of ambiguity
    foo(m + 0); // ok, because it's an expression of type int and not object's lvalue
}

void foo(int m)
{
    std::cout << "by value\n";
}
void foo(int &k)
{
    std::cout << "by reference\n";
}

我理解它引入了foo(m)的歧义,但当表达式为int(或其他可以转换为int)时,是否允许这样做?

我试图在此找到一些标准参考,但没有运气。

免责声明:请注意,它与Function Overloading Based on Value vs. Const Reference不重复。 const引用不同,因为它们可以使用 rvalues 进行分配,与“普通”,非const引用相反。

2 个答案:

答案 0 :(得分:9)

13.1 [over.load]非常清楚(除了多页注释)关于哪些函数不能在同一范围内重载。

您的案例未在此处列出,您可以声明这些重载,您无法轻易地使用它们。你可以像这样调用左值:

void (*f)(int&) = foo;
f(m);

这可以避免在致电foo(m)时发生的歧义。

除此之外:另一种写foo(m + 0)的方法只是foo(+m),一元+运算符将左值转换为右值,因此调用foo(int)重载。

答案 1 :(得分:7)

是的,允许。

没有规则可以防止这种过载。

  

[C++14: 13.1/1]:并非所有函数声明都可以重载。这里指定了那些不能重载的东西。 [..]

     

[C++14: 13.1/2]: (等等许多例外,不包括此案例)

对于语言来说,禁止在特定情况下某些调用中可能可能不明确的函数重载是非常有限的,并且没有充分的理由我可以添加!