C++中的左值右值,左值引用右值引用,以及std::move,std::forward函数的作用

C++11中左值和右值的概念比较关键。

1. 左值和右值

左值(lvalue)是放在赋值语句左边可以被赋值的值,左值必须在内存中有一个确定的地址。
右值(rvalue)用来放在赋值语句右边,将自己的值取出赋给别的变量,右值没有一个确定的地址。

2.引用

引用是C++所做的语法优化,本质是靠指针来实现,引用相当于变量的别名。

声明引用的时候必须初始化,且一旦绑定,就不能把引用绑定到其他对象。即引用必须初始化,不能对引用重定义。对引用的一切操作,都相当于对原始对象的操作。

3.左值引用和右值引用

左值引用:顾名思义,就是针对左值声明一个引用。
基本语法:type &引用名 = 左值表达式;

右值引用:针对右值表达式声明一个引用。
基本语法:type &&引用名 = 右值表达式;

右值引用就相当于用一个引用连接到本来没有确定地址的值(比如临时对象),以实现对右值的方便的修改。右值引用本身即可以是左值也可以是右值,具体取决于它有没有名字,如果它有名字,它就被当作左值处理,如果它没有名字,就会被当作右值处理。

4. 右值引用的意义

  1. 右值一般在表达式结束后就会消亡,如果想要继续使用右值,可能要把右值重新赋给一个左值,这可能会调用拷贝构造函数,把右值重新复制了一遍,造成了不必要的消耗。而对右值加上一个引用,就可以简单地继续使用右值,而不必要进行额外的拷贝。
  2. 右值引用用来支持转移语义,C++11中,转移语义可以将资源从一个对象转移到另一个对象,而不是调用拷贝构造函数进行额外的复制,减少了临时变量的创建、拷贝和销毁,可以大幅提高程序的性能。
  3. 在C++中,要实现转移语义,就需要定义相应的转移构造函数和转移赋值操作符。此时对于右值的拷贝和赋值就会调用转移构造函数和转移赋值操作符。如果没有定义,则还是会调用拷贝构造函数和赋值运算符。转移构造函数、转移赋值运算符和拷贝构造函数,拷贝赋值运算符的区别在于传入的参数是左值引用还是右值引用,以及转移函数中必须对右值的数据域进行修改。
    其中,参数(右值)的符号必须是右值引用符号,即“&&”;参数(右值)不可以是常量,因为我们需要修改右值;参数(右值)的资源链接和标记必须修改。否则,右值的析构函数就会释放资源。转移到新对象的资源也就无效了。

5. std::move和std::forward

  1. std::move将一个左值强制转换成一个右值引用;
  2. std::forwrad,完美转发,实现了参数在传递过程中保持其值属性的功能,即若是左值,则传递之后仍然是左值,若是右值,则传递之后仍然是右值。std::forward只有在它的参数绑定到一个右值上的时候,它才转换它的参数到一个右值;
  3. move和forward的本质就是类型转换个函数,在执行期(runtime),它们没有做任何事情,move实现到右值的无条件转换,forward实现到右值的有条件转换;

参考博客:
https://blog.csdn.net/p942005405/article/details/84644101
https://blog.csdn.net/xiaolewennofollow/article/details/52559306
https://www.jianshu.com/p/b90d1091a4ff

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值