为了支持移动操作,C++新标准引入了新的引用类型——右值引用,通过&&而不是&来获得右值引用,常规引用称之为左值引用,右值引用有完全相反的特性,只能绑定到要求转换的表达式,字面常量或是返回右值的表达式。
C++Primer在471页如上说明,但对于我们来说,我们只是想知道两者分别及应用,但无奈书中的知识点太绕嘴,我们现在来详解两者的区别
左值引用 我们在敲代码时是这样的
int i = 666;
int &j = i; //正确 j引用i;
//我们要分清与指针的区别
//指针
int *m = &i;//这样是指针
接下来我们看一些右值引用的类型
int i = 666;
int &&j = i * 666;//右值引用正确
C++Primer中这样说明 函数返回值是左值引用,赋值操作是返回左值,解引用和前置递增、递减都返回左值 算数,关系 位,后置递增、递减都是返回右值,我们来看代码格式
type fun() //函数返回右值 请用右值引用接受
{
return a
}
//函数返回操作
int &i = fun();//错误 返回值非引用函数返回是右值
type& fun()
{
return a;//返回左值
}
//解引用操作
int i = 6;
int *j = &i;
int k = *j; //解引用 返回左值
//前置递增递减
i++;
j--; //返回左值
//字面常量是右值
int &&i = 6;
//算数操作
int &&i = 5 * 6; //返回右值
int i = 1;
int j = 2;
int && k = i * j;//返回右值
++i;
--j;//都返回右值
根据这些例子 我们就能根据前文中所给的右值和左值类型进行判断和应用左值引用和右值引用
还有一点,我们可以将const的左值引用和右值引用绑定到右值上
左值和右值区别
左值持久;右值短暂?
标准库move函数
虽然我们不能将一个右值引用绑定到左值上,但我们可以把一个左值显式的转换成对应的右值类型
int i = 6;
int &&j = i;//错误无法将左值传递给右值引用
int &&k = std::move(i);//正确 显式move调用告诉编译器我么有一个左值,我们希望像一个右值一样处理
本人猪头一只,希望代码能被看懂,如有错误请提出
|