左值 右值 二

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;
}

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

原文地址:https://www.cnblogs.com/studywithallofyou/p/14573721.html