函数重载 - T和对T的引用

时间:2012-03-25 10:52:47

标签: c++

  

可能重复:
  «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&)?

2 个答案:

答案 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&可能是一个好的迹象,表明它们正在做着截然不同的事情(因此保证了不同的函数名称)。