asker160 发表于 2016-07-01 09:39

在等号左边就是左值吗? 临时变量在等号左边,算左值还是右值?

本帖最后由 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构造了一个临时变量,它出现在等号左边。那么它到底算左值还是右值,还是别的?

cjfeii 发表于 2016-07-22 11:50

a1+a2 的结果是一个对象,是一个临时变量,他是左值。

cjfeii 发表于 2016-07-22 11:51

作用域很小:$ g++ a.cpp
$ ./a.out
5
3
2

cclxpp123 发表于 2016-08-02 21:13

本帖最后由 cclxpp123 于 2016-08-02 21:31 编辑

a1+a2创造了一个临时对象,是一个xvalue.
左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。能得到地址的为左值,我们知道它在内存中的具体位置;右值是临时变量,得不到地址,但可以通过std::move()函数转化为左值
页: [1]
查看完整版本: 在等号左边就是左值吗? 临时变量在等号左边,算左值还是右值?