在其他帖子中,我遇到了
(5.2.9 / 8)类型“指向cv1 T类型D的成员的指针”的右值可以 转换为类型为“指向cv2类型B的成员的指针”的右值 T“,其中B是D的基类(第10节),
请注意语言标准。所以我的问题,
int i = 0;
int *p = &i;
*p = 1;
在所有情况下指针都是左值吗?什么时候被视为右值?
答案 0 :(得分:15)
指针不是可以是右值或左值的东西。指针是类型。唯一可以是右值或左值的是表达式。
考虑这个类似的问题:“整数是左值还是右值”。嗯,都不是。 “3”是整数和右值。 “3 = I;”是非法的。但是“我= 3;”如果'i'是整数,则是合法的。所以'i'是一个整数和一个左值。 '3'是整数和右值。
答案 1 :(得分:0)
除非它是sizeof运算符的操作数,否则_Alignof 运算符,一元&运算符,++运算符,-运算符或 的左操作数。运算符或赋值运算符, 没有数组类型的左值转换为存储的值 在指定对象中(不再是左值);这就是所谓的 左值转换。
...
名称“ lvalue”最初来自赋值表达式E1 = E2,其中左操作数E1必须是(可修改的)左值。最好考虑将其表示为对象 “定位符值”。
因此,由可修改的指针变量组成的表达式绝对可以充当左值,指向指针的指针也是如此:
int i = 0;
int *p;
p = &i; // 'p' is lvalue
int *q = p; // 'p' is rvalue, lvalue conversion
*p = i; // '*p' is lvalue
i = *p; // '*p' is rvalue, lvalue conversion
int **pp;
pp = &p; // 'pp' is lvalue
int **qq = pp; // 'pp' is rvalue, lvalue conversion
int ***ppp;
ppp = &pp; // 'ppp' is lvalue
int ***qqq = ppp; // 'ppp' is rvalue, lvalue conversion