zoukankan      html  css  js  c++  java
  • [005]Reference in C++左值与右值

    其实没有特意的想去研究研究C++的左值与右值,但是学习小组在研究引用的时候,发现右值引用这个大坑,而右值引用又是C++11才提出的,看了看,还是总结下

    一、左值与右值的定义

        在不同的C++标准里,对左值和右值的定义是有所不同的。

    C++03版:

        ①对于一个表达式,其不是左值就是右值;

        ②左值是对象(指针,对象实例)或者函数(比如返回引用的函数,这里有一点很重要只有声明没有初始化的就不能成为左值,比如char* p;初始化为空*p不是左值,因为*p不是对象)一些右值也是对象(另外一些右值是宏定义的常量、整形字面量、字符串字面量、浮点数字面量等);

        ③一些内建的操作符和函数调用会产生左值。E的指针类型,(E* p = new E;那么E调用dereference operator *后,)*E是左值表达式。再比如函数调用int& f()也产生左值,调用f()就是左值表达式

        ④调用返回值不为引用的函数得到的是对象是右值,用户自定义的操作符是普通函数,这些函数是否返回左值,参数是否需要左值是由函数的形参和返回值决定;

        ⑤转换(包括explicit类型转换,强制转换等)自临时变量但是结果为非引用的表达式是右值;

        ⑥当左值出现在需要右值的地方,左值会转化为右值;

        ⑦右值需要完整的类定义或者是void类型,另外,左值可以是非完整定义的类型;

        ⑧为了修改对象必需使用左值。当然也有一种特例,右值对象通过调用自己的成员函数来修改自身

        可以看到,在C++03标准中,并没有对左值和右值进行一个非常明显的定义,只是说明了表达式不是左值就是右值,函数返回引用的是左值表达式,而返回非引用的是右值表达式,还有一系列判断其到底是左值还是右值的方法。

        那么,到底什么才是左值和右值的标准定义呢?我们来看看最新的C++11标准中的对左值和右值的定义:

    C++11版:

       1、比较通俗的说话:

           左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存在的临时对象。

           区分左值与右值的便捷方法是:看能不能对表达式取地址,如果能,则为左值,否则为右值。

       2、C++11对LValue和RValue的界定:

           所谓“值”,都是针对表达式而言的,下图为C++11标准中对表达式的分类:

             

           1)lvalue仍然是传统意义上的左值;
           2)xvalue(eXpiring value)临终值,按照字面的理解,这个一个即将消亡的值。

               实际上,它是某些涉及到右值引用的表达式的值,引用C++11用的原话为:An xvalue is the result of certain kinds of expressions involving rvalue references。

               例如:调用一个返回类型为右值引用的函数的返回值就是xvalue。

           3)prvalue指代一个临时对象、一个临时对象的子对象或者一个没有分配给任何对象的值。prvalue即老标准中的rvalue。

              例如:一个函数的返回值是平常类型,其返回值是rvalue。例如int foo();没有分配给任何对象的值。如5.3,true。

           4)glvalue(generalized value)被称为广义的左值,包括传统的左值和xvalue。
           5)rvalue(right value)被称为广义的右值,因为除了传统意义上的右值,还包括xvalue。

           6)lvalue和prvalue分别跟传统意义上的左值和右值概念是一致的,只是增加了xvalue这样一个概念。

     那么 ,这个xvalue到底是什么定义呢?

           从字面上去理解:An xvalue is the result of certain kinds of expressions involving rvalue references,即某些涉及到右值引用的表达式的值。关于右值引用,敬请参考下一篇博客。

  • 相关阅读:
    Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常
    BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
    Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal
    Codeforces 316G3 Good Substrings 字符串 SAM
    Codechef CHSIGN Change the Signs(May Challenge 2018) 动态规划
    BZOJ1396 识别子串 字符串 SAM 线段树
    CodeForces 516C Drazil and Park 线段树
    CodeForces 516B Drazil and Tiles 其他
    CodeForces 516A Drazil and Factorial 动态规划
    SPOJ LCS2
  • 原文地址:https://www.cnblogs.com/hustcser/p/2850356.html
Copyright © 2011-2022 走看看