右值是如何解除引用的?

时间:2016-03-21 03:30:44

标签: c++ dereference lvalue rvalue

  

前缀运算符返回对象   本身作为左值。后缀运算符返回对象原始值的副本   作为右值。

所以在一个像*a++这样的语句中,a正在递增,a的原始值的副本作为rvalue返回,但是从Lvalues和Rvalues上的microsoft c ++语言引用返回

  

rvalue是一个临时值,不会超出使用它的表达式

并举一个例子

// lvalues_and_rvalues1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
   int x = 3 + 4;
   cout << x << endl;
}
  

在此示例中,x是左值,因为它超出了定义它的表达式。表达式3 + 4是一个rvalue,因为它计算的临时值不会超出定义它的表达式。

我的问题:
1)从*a++返回的右值是什么,以便可以取消引用? 2)我误解了任何概念吗? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

  

前缀运算符将对象本身作为左值返回。后缀运算符将对象原始值的副本作为右值返回。

错误!嗯,大多数情况。如果引用是在谈论所有前缀/后缀运算符,那么它就完全错了。但是,如果它正在讨论++--前缀/后缀对,那么它是正确的。

现在,考虑到这一点......

  

从* a ++返回的rvalue是什么,以便可以取消引用?

假设a是某种指针,a++递增a并在递增之前产生由a的值组成的右值。后缀和前缀形式中的递增和递减运算符++--需要左值作为其运算符。这是因为rvalues是临时的,也就是说,它们的范围受到它们出现的表达式的限制,因此这些运算符对它们几乎没有意义。请记住,这些操作符不仅 inspect / 读取,而且更改 / 写入变量本身。

一元*运算符接受一个指针(类似)对象并取消引用它,产生一个在那里找到的左值。它适用于右值和左值指针。这是因为*可以被认为是“被动”运算符。它不会更改 / 写入指针本身,但取消引用它并在指针存储的地址返回左值对象,其地址当然包含在指针。由于*需要的是指针对象中包含的内存地址,并且指针本身的地址(如果它有一个)在这里没用,*对rvalues和lvalues都有意义

你可以认为*“需要一个rvalue”,并且“lvalues可以在必要时用作rvalues”,如果它能更多地澄清(或混淆?)事物。

答案 1 :(得分:0)

*a++相当于:

auto temp = *a;
a++;
// Use the value of temp here

除了你只能引用一次值,而temp可以多次引用。