考虑以下代码:
#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]:
(等等,很多异常,不包括这种情况下的任何异常(
对于语言来说,禁止函数重载将是极其有限的,因为在某些情况下,使用某些调用,可能会不明确,我可能会毫无理由地补充!