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

Grz*_*ski 8 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";
}
Run Code Online (Sandbox Code Playgroud)

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

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


免责声明:请注意,它不是基于Value vs. Const Reference函数重载的重复.的const引用是不同的,因为它们可以与被分配右值,作为相对的"普通",非const引用.

Jon*_*ely 9

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

你的案例没有列在那里,你可以声明那些重载,你不一定能轻易使用它们.你可以像这样调用左值:

void (*f)(int&) = foo;
f(m);
Run Code Online (Sandbox Code Playgroud)

这可以避免您打电话时出现的歧义foo(m).

另外:另一种写入方式foo(m + 0)很简单foo(+m),一元运算+符将左值转换为右值,因此foo(int)调用了重载.


Lig*_*ica 7

是的,这是允许的.

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

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

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

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