• 左值和右值得研究


    关于左值引用和右值引用的问题

    Hello,各位看官好,最近我在通读源码的时候看到了一个关键字decltype,我对这个关键字很不理解,所以就上网搜索了一下,发现了很多我不知道的东西,那么在读这个关键字的同时,我还发现了左值和右值,左值引用,右值引用这四者之间的关系,这是我之前所没有搞清楚的,所以我想趁此时机好好的把这些东西搞清楚。

    一、左值和右值

    1.1 左值和右值得概念

    1.2 左值和右值得特点

    1.3 什么情况是左值,什么情况是右值

    二、左值和右值得关系

    三、左值引用和右值引用

    四、左值引用和右值引用的关系

    一、左值和右值

    1.1 左值和右值的概念

    首先我们来说一下左值和右值,首先这里说一下,表达式所有的结果要么是左值,要么就是右值。

    那么究竟什么是左值,什么又是右值呢?在c++ Prmer Plus中,所谓左值,就是说前者可以所表示的意义就是内存中所占用的对象,所谓右值,就是说这个值代表的内容。

    举一个最简单的例子:int a = 3;

    在这个表达式中,中间这个=至关重要,这个等号我们称其为赋值符号,就是说把右侧的值赋给了左侧的值,那么这样就是显而易见的,a是一个左值,因为他代表的含义就是内存中所占用的对象,3代表一个右值,表示的是表示的实际内容3.

    那么搞清楚了左值和右值得概念,我们来说一下什么情况是右值,什么情况是左值。

    1.2 左值和右值得特性

    左值和右值得特性有两个不同:

    1、左值长远,右值短暂

    左值是我们一直要用到后面的东西,所以左值是临时变量,右值是很短暂的,就是用过就消失的,一般来说是表达式。

    2、左值可写可读,右值可读

    左值是可读可写的,就是我们既可以读出左值得表达结果,也可以对其进行赋值,但是右值只是可读的,比如,我们不能写3=a这种表达式。

    1.3 什么情况是左值,什么情况是右值

    什么情况是左值呢?就是说变量都是左值,什么情况是右值呢?一般来说常量或者表达式就是右值,这两者有什么关联呢?常量可以认为是最简单的表达式。

    三、左值引用和右值引用

    首先说一下,左值引用和右值引用和左值,右值不是一回事,这里不能一概而论。

    左值引用和左值得关系:首先,左值引用是左值产生的,就是int &b = a;但是不能写int &b = a+3,同理,右值引用也是一样的。

    右值引用和右值得关系:除了上述特性外,右值引用和右值还有一个重要的区别,就是右值引用可以修改值,可以写成 int &&b = a+3,因为右值引用是拥有左值得属性。

    两者之间用途的不同:主要是函数方面的区别,左值引用可以用作返回的概念上,但是必须添加&,其余的都是右值。

    四、左值引用和右值引用的关系

    最后说一下左值引用和右值引用的关系,两者之间可以用std::move来转换。即是:int &&r1 = std::move(rr2);

    4. 总结

    左值与右值是表达式的属性,也是运算符处理运算对象时对运算对象的要求及返回的结果的属性。右值要么是字面值常量,要么是表达式求值过程中创建的临时对象。左值通常是程序员创建的对象。

    左值通常持久,右值通常是编译器创建的临时变量。左值大部分情况下可以修改,右值不可以,有两个例外情况。可以在要求使用右值的地方使用左值代替,有一个例外情况。

    左值引用和右值引用是两种复合数据类型,他们都是左值,是C++为了区分开左值和右值创建的。我们可以使用右值引用实现内存的移动操作,避免二次开销。

  • 相关阅读:
    Vs 开发时无法断点问题
    VS启动调试速度异常的缓慢问题
    vs2017 调试时 浏览器关闭不想中断调试
    聚簇索引和非聚簇索引
    java实现阿里云短信服务发送验证码
    mysql定时器
    token,加密,签名
    Redis更新缓存同步数据库的理解
    Token
    解决哈希冲突的方法
  • 原文地址:https://www.cnblogs.com/songyuchen/p/14635292.html
Copyright © 2020-2023  润新知