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

function overloading - T and reference to T

本文关键字:引用 和对 重载 函数      更新时间:2023-10-16

可能重复:
«;F(5)»;和«;int x;F(x)»;调用不同的函数
我们是否可以仅根据参数是值还是引用来重载函数?

假设我们有不同参数的函数f:

void f(int)
{
}
void f(int&)
{
}
int main()
{
int a = 42;
f(a);
}

如何调用void f(int&)?

您可以这样做:

int main() 
{ 
    int a = 42;
    void (*fp)(int&) = &f; // (A)
    fp(a);
} 

这里,我们取一个函数指针,指向一个重载函数f。正如我在回答另一个问题时所解释的那样,编译器将选择适当的函数来使第(A)行工作。请注意,我没有使用石膏;这样,如果我更改函数签名,使以上内容不起作用,编译器将发出错误,而不是潜在地允许代码调用未定义的行为。

尽管对于这种情况,最好简单地给这两个函数取不同的名称。像这样:

void take_f(int)    {}
void modify_f(int&) {}
int main() 
{ 
    int a = 42;
    modify_f(a);
}

这允许代码具有更清晰的意图,并且不会出现重载问题。当然,您可以想出比take_f()modify_f()更好的名称。

无论如何,这种方式更有意义,因为一个函数取int,另一个取int&可能是一个好迹象,表明它们正在做明显不同的事情(因此需要不同的函数名称)。

您可以说f(static_cast<const int &>(a)>)来强制使用int重载。非常常量重载不能通过参数来消除歧义,但您可以强制转换函数本身:

static_cast<void(&)(int&)>(f)(a);

(当然,你总是可以像这样手动选择一个特定的过载,所以这不再是真正的"过载解决方案"了。)