没有歧义的情况下,函数重载通过引用是允许的吗?

8
考虑以下代码:
#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的类型)时,这种情况是允许的吗?

我尝试查找一些标准参考资料,但是没有成功。


免责声明:请注意,这不是基于值与常量引用的函数重载的副本。因为const引用可以与rvalues赋值,而"普通"非const引用则相反。


1
m 也是 int 类型的表达式。 - Kerrek SB
1
可能是基于值和const引用的函数重载的重复问题。 - Piotr Siupa
2个回答

9

13.1 [over.load]十分明确(除了一个跨越多页的注释),说明了在同一作用域内哪些函数不能被重载。

你的情况在其中没有列出,因此你可以声明这些重载版本,但不一定能方便地使用它们。你可以这样调用左值引用的版本:

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

当您调用foo(m)时,可能会产生歧义,使用foo(m+0)可以避免这种情况。

另外一种写法是foo(+m),一元操作符+将左值转换为右值,因此调用foo(int)重载函数。


7

可以的。

没有任何规定禁止这种重载。

[C++14: 13.1/1]: 并非所有函数声明都可以进行重载,不能进行重载的已在此指定。[..]

[C++14: 13.1/2]: (包括很多例外情况,但不包括这种情况)

禁止函数重载对语言来说非常限制,而且没有合理的理由,因为在某些情况下某些调用可能会产生歧义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接