函数重载-T和对T的引用
function overloading - T and reference to T
可能重复:
«;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);
(当然,你总是可以像这样手动选择一个特定的过载,所以这不再是真正的"过载解决方案"了。)
相关文章:
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- C++指针和对指针的引用
- C :如何区分对类成员的引用和对普通变量的引用
- C 对CODE :: morsecode()的不确定引用和对Code :: AlphaCode()的未定义引用
- CUDA:结构体的共享数据成员和对该结构体的引用成员具有不同的地址和值
- 将 wstring、string 和对枚举变量的引用从 C# 传递到 C++(非托管 DLL)
- 对我的 BFS 磁贴类中的引用和指针感到困惑
- 保留对象和对在函数中创建的对象的引用
- 单例实现和对 ::GetInstance 的未定义引用
- C++和对XML_Parser的未定义引用
- 函数重载-T和对T的引用
- 如何在c++中拥有私有成员变量和对它们的引用
- C++返回了对析构函数的未定义引用和对局部变量的引用
- “迭代器”和“对元素的引用”之间的区别
- C++11:对const、volatile、左值引用和右值引用限定的成员函数指针进行抽象
- 对"类的typeinfo"的未定义引用和对"vtable for class"的未定义引用
- 为什么Perf和Papi对L3缓存引用和缺失给出不同的值
- 声明对对象的引用和赋值操作符
- 了解 C++ 中对迭代器的常量引用和非常量引用。为什么我不能在打印函数中使用对迭代器的非常量引用?
- 对"yylex"的未定义引用和对"yyin"的未定义引用