可能重复:
«F(5)» and «int x; F(x)» to call different functions?
Can we overload a function based on only whether a parameter is a value or a reference?
假设我们有不同参数的函数f:
void f(int)
{
}
void f(int&)
{
}
int main()
{
int a = 42;
f(a);
}
如何调用void f(int&)?
答案 0 :(得分:2)
您可以说f(static_cast<const int &>(a)>)
强制使用int
重载。非const重载不能通过参数消除歧义,但您可以自行转换函数:
static_cast<void(&)(int&)>(f)(a);
(当然你可以像这样手动选择一个特定的过载,所以这不再是“重载分辨率”了。)
答案 1 :(得分:2)
您可以这样做:
int main()
{
int a = 42;
void (*fp)(int&) = &f; // (A)
fp(a);
}
这里,我们将一个函数指针指向其中一个重载函数f
。作为explained in my answer to another question,编译器将选择适当的函数以使(A)行工作。请注意,我没有使用演员;这样,如果我更改函数签名,使得上面的代码不起作用,编译器将发出错误,而不是潜在地允许代码调用未定义的行为。
虽然对于这种情况,最好简单地给两个函数赋予不同的名称。像这样:
void take_f(int) {}
void modify_f(int&) {}
int main()
{
int a = 42;
modify_f(a);
}
这允许代码具有更清晰的意图,并且您不会遇到重载问题。当然,您可以提出比take_f()
和modify_f()
更好的名称。
无论如何,这样做更有意义,因为让一个函数有一个int
而另一个函数int&
可能是一个好的迹象,表明它们正在做着截然不同的事情(因此保证了不同的函数名称)。