在等号左边就是左值吗? 临时变量在等号左边,算左值还是右值?
本帖最后由 asker160 于 2016-07-01 19:54 编辑int a=1;//这个a是左值无疑吗?
int a;
a=1;
int *b;
*b=a;//这个*b是左值吗?
问题,我可以构造一个临时变量,让它出现在等号的左边,如下:
#include<iostream>
using namespace std;
struct A{
int m_i;
A(int i):m_i(i){}
A& operator=(int i){
m_i=i;
return *this;
}
A operator+(const A&other){
return A(m_i+other.m_i);
}
~A(){cout<<m_i<<endl;}
};
int main()
{
A a1(2);
A a2(3);
(a1+a2)=5;//这里的(a1+a2)是左值还是右值?
return 0;
}上面的main函数中,a1+a2构造了一个临时变量,它出现在等号左边。那么它到底算左值还是右值,还是别的? a1+a2 的结果是一个对象,是一个临时变量,他是左值。 作用域很小:$ g++ a.cpp
$ ./a.out
5
3
2
本帖最后由 cclxpp123 于 2016-08-02 21:31 编辑
a1+a2创造了一个临时对象,是一个xvalue.
左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。能得到地址的为左值,我们知道它在内存中的具体位置;右值是临时变量,得不到地址,但可以通过std::move()函数转化为左值
页:
[1]