考虑以下代码:
#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
引用资料。
最佳答案
13.1 [over.load] 非常清楚(除了多页注释)关于哪些函数不能在同一范围内重载。
你的案例没有在那里列出,你可以声明那些重载,但你不一定能轻易使用它们。你可以这样调用左值:
void (*f)(int&) = foo;
f(m);
这避免了调用 foo(m)
时发生的歧义。
旁白:另一种编写foo(m + 0)
的方法就是foo(+m)
,一元+
运算符将左值到右值,因此调用了 foo(int)
重载。
关于c++ - 在没有歧义的情况下是否允许通过引用重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453992/