zoukankan      html  css  js  c++  java
  • 第1年7月9日 浅析C++11右值引用和move语义

    1.

    右值:只可以放在等号右侧的变量。例如下面的例子:

    这里的a+2只能放在等好的右侧,所以a+2是右值。

    为什么a+2只能放在等号右侧呢?原因在于a+2会产生一个临时变量,b=a+2实际上是先算出a+2的结果存储到临时变量然后赋值给b,并销毁这个临时变量。如果将a+2放到等好的左侧,那么将产生无意义的结果。

    综合上面的左值和右值的概念我们可以得到“左值持久,右值短暂”的概念。左值持久存在,右值将在运算结束后销毁。

    0x02 右值引用

    上面已经介绍了右值的概念,从右值引用的名字上可以看出,右值引用就是对右值进行引用操作。例子如下:

    我们使用两个与符号表示右值引用,从上面的例子中可以看出,普通的引用的等号右侧不可以是一个右值,而右值引用的左侧必须是一个右值。那么中间道理发生了什么呢?其实右值引用指向的是将要销毁的对象,也就是前面提到的a+2产出的临时对象,在对象销毁之前该引用可以接管其资源。

    有些时候我们偏偏需要将左值转换为右值引用怎么办呢?ok move语义登场。

    0x03 move语义

    从上面的介绍我们可以总结出,只有右值可以绑定到右值引用上。但是,话不能说的太慢。我们总有办法能将左值也绑定到右值引用上,我们可以显式的使用move将一个左值转换为对用的右值引用类型。如下:

    此时,a和b的地址是相同的,b将是a的应用。

    总结出来move的概念其实很简单,就一句话:将一个左值转换为对用的右值引用类型。

    这里需要注意一点的就是,右值引用的是将要销毁的对象,使用move调用意味着告诉编译器我们有一个左值,但想像右值一样使用,所以调用move后原来的对象除了赋值和销毁它外不能有其他的操作(书上是这么说的,但是测试的时候未发现问题)。

    https://www.k2zone.cn/?p=1880

    https://www.cnblogs.com/exciting/p/11156900.html

  • 相关阅读:
    Axure RP 8.0 中继器初体验
    随便写的随机数生成器,目前并没有实现设置精度和去重功能
    PHP向MySql中插入数据
    php连接mysql数据库练手
    C随便练练手的题
    个人档案 7-5
    个人档案
    个人档案 7-4
    个人档案 6-30
    个人档案 6-29
  • 原文地址:https://www.cnblogs.com/javastart/p/14989803.html
Copyright © 2011-2022 走看看