前缀运算符返回对象 本身作为左值。后缀运算符返回对象原始值的副本 作为右值。
所以在一个像*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)我误解了任何概念吗?
提前谢谢!
答案 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
可以多次引用。