在另一篇文章中,我遇到了以下内容:
(5.2.9/8) 类型为“指向类型为cv1 T的D类成员”的右值可以转换为类型为“指向类型为cv2 T的B类成员”的右值,其中B是D类的基类(第10条款),
请注意这是语言标准中的内容。因此我的问题是,
int i = 0;
int *p = &i;
*p = 1;
指针在所有情况下都是左值吗?什么时候会被视为右值?
指针并不是可以作为 rvalue 或 lvalue 的类型,指针是一个类型。唯一可以作为 rvalue 或 lvalue 的是表达式。
考虑下面类似的问题:“整数是一个 lvalue 还是 rvalue”,实际上都不是。例如,数字“3”是一个整数且是 rvalue。语句 3=i;
是非法的。但如果 i
是一个整数,语句 i=3;
是合法的。所以 i
是一个整数且是 lvalue,而 3
是一个整数且是 rvalue。
p
是一个左值,并且还是指针类型。你的问题就像是“思想有四个字母吗?”当我说“思想不是那种可以有四个字母的东西”时,你回答说“但 思想 确实有四个字母!” 一个表达式可以是左值或右值,但指针不行。指针类型的表达式可以是左值或右值,就像一个单词可以有四个字母,无论它是不是“思想”这个词。 - David Schwartz
&i
是一个类型为int*
的表达式,因此是指针被视为rvalue的一个例子。你正在将表达式&i
的结果作为赋值运算符的rvalue,并使用int *p
作为该运算符的lvalue。 - matthias