C++进阶之右值引用

为了支持移动操作,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调用告诉编译器我么有一个左值,我们希望像一个右值一样处理

本人猪头一只,希望代码能被看懂,如有错误请提出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值