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



考虑以下代码:

#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 valuen";
}
void foo(int &k)
{
    std::cout << "by referencen";
}

我知道它会给foo(m)带来歧义,但当表达式类型为int(或另一个可以转换为int的表达式(时,这是允许的吗?

我试图在这方面找到一些标准参考,但没有成功。


免责声明:请注意,它不是基于值的函数重载与基于构造引用的函数重载的重复。const引用不同,因为它们可以分配右值,与"普通"非const引用相反

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

你的案例没有列在那里,你可以声明这些重载,只是你不一定能轻松使用它们。你可以这样称呼左值:

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

这样可以避免在调用foo(m)时出现歧义。

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

是的,这是允许的

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

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

[C++14: 13.1/2]:(等等,很多异常,不包括这种情况下的任何异常(

对于语言来说,禁止函数重载将是极其有限的,因为在某些情况下,使用某些调用,可能会不明确,我可能会毫无理由地补充!

最新更新