首先简要了解下左值
与右值
,直观简洁的解释如下:
有关引用
大家一定不陌生,引用
可以说就是,变量的别名,但是之前说的引用都属于左值引用
,简单回顾下左值引用
,示例如下:
int number = 10;
// 引用定义的时候必须被初始化
int& lr_number = number;
const int c_number = 10;
// 此处会报错,const 变量不能用于非const引用
int& lr_c_number = c_number;
// 下面是ok的
const int& c_lr_c_number = c_number;
// 直接用右值初始左值引用将会报错,但是const引用可以直接接收右值
int& lr = 10;
const int& c_lr = 10;
之前也提到右值
是被认为无用的资源,但在某些情况下也会使用到右值,所以在C++11
中使用使用右值引用
来重用右值,右值引用
的简单使用如下:
/*
1. 右值引用的定义使用 &&
2. 右值引用无法被左值初始化
3. 右值引用被初始化后,改变了就变成了一个左值,可以被赋值
*/
int&& rr = 100;
int x = 100;
// 无法被左值初始化
int&& rr1 = x;
// 初始化后可以被赋值,即改变量变成一个左值
rr = 200;
左值引用
与右值引用
在函数重载是会重载不同的版本,示例如下:
void reference(int& lref)
{
cout << "left_reference\n" << endl;
}
void reference(const int& lref)
{
cout << "const_left_reference\n" << endl;
}
void reference(int&& rref)
{
cout << "right_reference\n" << endl;
}
int main()
{
int test = 100;
// 输出 left_reference
reference(test);
// 输出 right_reference
// 注意这里涉及最优匹配问题,若没有第三个函数则会输出 const_left_reference
reference(1000);
}
更为官方详细的上cppreference学习观看