函数重载的关键的函数的参数列表–也称为函数特征标。
如果函数参数数目和/或者参数类型不同,则特征标也不同。
引用重载
#include <iostream>
using namespace std;
void func(double &r1)
{
cout << "func1\n";
}
void func(const double &r2)
{
cout << "func2\n";
}
void func(const double &&r3)
{
cout << "func2\n";
}
void func(double && r3)
{
cout << "func3\n";
}
int main()
{
double x = 5.5;
func(x);
const double y = 7.8;
func(y);
func(x+y);
}
其中左值引用参数r1与可修改的左值参数匹配;
const左值引用参数r2与可修改的左值参数、const左值参数和右值参数(如两个double之和)匹配;
左值引用参数r3与右值匹配。
其中与r1和r3匹配的参数都与r2匹配。这就带来了一个问题:如果重载使用这三种参数的函数,结构如何?答案是将调用最匹配的版本:
结果
func1
func2
func3
万能引用
针对左值,万能引用等效左值引用;针对右值,等效与右值引用。
#include <iostream>
#include <vector>
using namespace std;
template <class T>
void func1(T &&a)
{
cout << a << endl;
printf("func4\n");
}
int main()
{
double x = 5.5;
const double y = 7.8;
func1(456);
func1(x+y);
func1(x);
func1(y);
}
456
func4
13.3
func4
5.5
func4
7.8
类型引用和类型本身
下面会重载编译不会出错
#include <iostream>
using namespace std;
void func(double &r1)
{
cout << "func1\n";
}
void func(double r2)
{
cout << "func2\n";
}
1、当我们这样调用时,编译器无法区分,编译报错
int main()
{
double x = 5.5;
func(x);
}
errno.cpp: In function ‘int main()’:
errno.cpp:18:11: error: call of overloaded ‘func(double&)’ is ambiguous
func(x);
^
errno.cpp:4:7: note: candidate: void func(double&)
void func(double &r1)
^
errno.cpp:9:6: note: candidate: void func(double)
void func(double r2)
2、这样时,编译通过
int main()
{
const double x = 5.5;
func(x);
}