c++之左值和右值

淡淡的烟草味﹌ 2022-03-12 05:27 276阅读 0赞

1,左值和右值
定义:左值与右值这两概念是从 c 中传承而来的,在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),换句话说,就是表示内存中可以寻址,可以给它赋值(const类型的变量例外);右值指的则是只能出现在等号右边的变量(或表达式),表示可以知道它的值(例如常数)。变量地址可读可写的是左值,只可读的是右值。

注意:在 c 语言中,通常来说有名字的变量就是左值,而由运算操作(加减乘除,函数调用返回值等)所产生的中间结果(没有名字)就是右值。在 c++ 中,每一个表达式都会产生一个左值,或者右值,相应的,该表达式也就被称作“左值表达式”, “右值表达式”。对于基本数据类型来说(primitive types),左值右值的概念和 c 没有太多不同,不同的地方在于自定义的类型,而且这种不同比较容易让人混淆:

  1. 对于基础类型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修饰(cv-qualitification ignored)
  2. 对于自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。(c++特有的)
    3)右值不能当成左值使用(但左值可以当成右值使用)。另外值得注意的是,对于前面提到的右值的两个特性:
    (1) 右值允许调用成员函数。
    (2) 右值只能被 const reference 指向。
    (3) 右值不能当成左值使用,但左值可以当成右值使用
    总结:
    左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象
    右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。

纯右值:***非引用返回的临时变量( int func(void) )***、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等。
将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值。

  1. int i = 9; //有一个内存 取个名字叫做i, 存了9
  2. int& r1 = i; //左值引用:r1是i的别名
  3. int&& r = std::move(i); //右值引用: 直接使用9,std::move() 函数,把左值转成右值
  4. const cs& ref = get_cs(); //右值只能被 const 类型的 reference 所指向

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++

    左值(lvalue)右值(rvalue) 在C++11中所有的值必属于左值、右值两者之一,可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。

    相关 C 语言

    C 语言左值和右值 术语 `lexp` 表示左值表达式,`rexp` 表示右值表达式。 左值意味着一个位置,而右值意味着一个值。在使用右值的地方也可以使用左值,但是在

    相关 C语言】

    > `左值就是“=”号左边的变量或表达式,是一个确切的,具有实际空间的存储地址,右值是一个数据,因此左值不能是一个字面值。` 按字面意思,通俗地说。 > 就是以赋值符号 =

    相关 c++

    1,左值和右值 定义:左值与右值这两概念是从 c 中传承而来的,在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),换句话说,就是表示内存中可以