[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标准中对表达式的分类:

         [005]Reference in C++---左值与右值

       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,即某些涉及到右值引用的表达式的值。关于右值引用,敬请参考下一篇博客。

原文链接: https://www.cnblogs.com/hustcser/archive/2013/01/07/2850356.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    [005]Reference in C++---左值与右值

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/74723

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午4:32
下一篇 2023年2月9日 下午4:33

相关推荐