C++右值引用相关

能够取地址值、有名字的就是左值,不能取地址值、没名字的就是右值。

移动语义

将内存的所有权从一个对象转换到另一个对象,高效的移动来替换效率低下的赋值。


完美转发

定义一个函数模板,该函数模板可以接受任意类型参数,然后将参数转发给其它目标函数,且保证目标函数接受的参数类型与传递给模板函数的类型相同。


左值引用

在早期的C++版本中,只能对左值进行引用,对于右值引用会报错。

int a = 10;
int &b = a;//正确
int &c = 10;//错误

如果想要对右值引用的话,可以通过常量左值引用的方式,去操作右值。常量左值引用既可以操作左值,又可以操作右值

int a = 10;
const int &b = a;
const int &c = 10;

但是用常量左值引用操作的右值,实际上是没有什么意义的。因为如果我们没有办法修改这个右值(移动语义)。因此在C++11中引入了右值引用


右值引用

右值引用的记号为&&与声明左值引用需要初始化操作一样,右值引用也需要初始化操作,且只能由右值进行初始化操作

int a = 10;
int &&b = a;//错误,因为a是左值
int &&c = 10;//正确

同时右值引用可以对右值进行修改。需要注意的是:右值引用支持常量右值引用,如下所示,但是这样定义出来的右值引用毫无用处。

int &&a = 10;
a = 100;
cout<<a<<endl; //输出100

const int &&c = 10;//也不会报错,但是没啥意义

上面讲到的常量右值引用毫无用处的原因是:右值引用的主要目的就是用于移动语义和完美转发。移动语义需要有修改右值的权限;其次常量右值引用完全可以由常量左值引用去替代。

看一个例子,函数foo的返回值a在函数内部创建然后被赋值给num,其中num获得这个对象时,会将a拷贝一份,然后再销毁掉a。如果a比较小还好,如果这里是一个非常大的容器,那么起始会造成大量额外的内存开销。

int foo(){
	int a  =  10;;
	return a;
}

int num = foo();

参考

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值