Bootstrap

C++左值和右值

C++中的左值和右值_c++左值和右值-CSDN博客

左值:程序可以获取其地址,可以通过地址访问它们,是可被引用的数据对象。

可修改的左值:

    int m;
    cout << &m;

不可修改的左值。

如const变量:可以取地址,但不可对其赋值。

    const int m = 5;
    cout << &m;

左值指表达式结束后仍然存在的持久对象。

右值是指表达式结束时就不再存在的临时对象。

一个区分左值和右值的便捷方法是:看能不能对表达式取地址。

class IntClass {
private:
	int x;
public:
	IntClass(int value) :x(value) {}
};


cout << &IntClass(6);

所有具名对象或变量都是左值,而右值不具名。

上面的例子验证了这句话。 

通过排他性定义的话,每个表达式不是左值就是右值。

 C++11中,右值有两个概念组成:

一个是将亡值:

与右值引用相关的表达式。

比如:

将要被移动的对象

一个是纯右值:

包括:

非引用返回的临时变量

这是什么?

int test()
{
	return 10;
}
int main(int argc, char* argv[]) {
	&test();
}

运算表达式产生的临时变量

    &(1 + 2);

我自己理解的话:这样应该也会产生临时变量吧

 

    int a = 1;
    int b = 2;
    &(a + b);

原始字面量

 

字面量本身是不可寻址的。

lambda表达式.

 

;