• 左值 右值 二


    https://www.jianshu.com/p/94b0221f64a5
    https://en.cppreference.com/w/cpp/language/value_category
    https://en.cppreference.com/w/cpp/language/operator_member_access

    通俗定义

    • 大体还可以根据是否可以放到等号左右来区分,如果可以放到等号左边,就是左值,只能放到等号右边,就是右值

    • 左值肯定在内存中有一个空间保存,右值可以理解为临时的数据,并没有专门保存

    实例

    int a = 123;
    

    这里a是一个变量,有对应内存空间,所以a是左值,并且a可以放到等号左边,123是右值,它赋值完后就没了,并没有专有内存保存,并且不可以放到等号左边,只能在右边

    int a = 123;
    int * b = &a;
    

    这个也是可以的,因为&符号,取地址符,是传入一个左值,返回一个纯右值。

    int a;
    123 = a;
    int * b = &123;
    

    这样都是不可以的,首先123是右值,不能放到等号左侧,它没有对应空间,无法保存a的值,同样,因为&需要传递一个左值,并且123没有空间,就没办法取地址

    函数根据其返回值不同会有不同的意义,返回为左值引用的函数可以做左值,返回为非引用的只能做右值

    int test1()
    {
        return 123;
    }
    int b;
    int& test2()
    {
        b = 123;
        return b;
    }
    

    test1() = 123;是错误的,因为是test1返回的是右值,不能赋值

    test2() = 123;是对的,因为返回的是b,是左值

    左值可以转换为右值

    int a = 123;
    int b = 123;
    int c = a + b;
    

    这里a + b变成了右值

    可以将一个右值常量绑定到一个左值const引用

    const int & a = 123;
    

    123的生命周期延长至与a相同

    同理,如下调用是合法的

    int test(const int & a)
    {
        return 0;
    }
    int main()
    {
        test(123);
        return 0;
    }
    

    版权声明:本文版权归作者所有,如需转载,请标明出处

  • 相关阅读:
    sublimetext插件安装
    解决Nextcloud 无法删除目录
    常用文章信息
    使用豆瓣的pip源安装python模块
    top命令的使用
    Centos 7 防火墙 firewalld 简单使用说明
    CentOS 7 时间同步方法
    二进制
    字典
    集合
  • 原文地址:https://www.cnblogs.com/studywithallofyou/p/14573721.html
Copyright © 2020-2023  润新知