@CrazyHenry
2018-01-28T17:54:02.000000Z
字数 742
阅读 1221
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
作者:573xmcgcg
链接:https://www.zhihu.com/question/35776952/answer/64411299
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
举个例子:
#include <iostream>
using namespace std;
struct A
{
int n;
A() = default;
A(int m): n(m) {}
};
int main()
{
A st(5);
A* pst = &st;
cout << st.n << endl; //输出5,st是左值,在该表达式执行完毕后依然存在
st.n = 6; //合法,可以对左值赋值
cout << pst->n << endl; //输出6,pst是左值,在该表达式执行完毕后依然存在
pst->n = 7; //合法,可以对左值赋值
cout << A(8).n << endl; //输出8,A(8)是右值,在该表达式执行完毕后被销毁
A(8).n = 9; //非法,不能对右值赋值
pst = &(A(8)); //非法,不能取右值的地址
return 0;
}
因为指针所指的对象一定是一个左值,所以使用->返回的成员也一定是左值。而对右值对象调用成员调用运算符(.)是合法行为,但是这个被调用的成员在对象被销毁时也一并被销毁,所以整个成员也是右值。
临时量都是右值!所以所有字面量都是右值!