指针是左值还是左值?

use*_*635 3 c++ pointers

在其他帖子中,我遇到了

(5.2.9/8)类型"指向类型为cv1 T的D成员的指针"的右值可以转换为类型为"指向cv2 T类型的B成员的指针"的右值,其中B是基类(子句) D)的10)

请注意语言标准.所以我的问题,

int i = 0;
int *p = &i;
*p = 1;
Run Code Online (Sandbox Code Playgroud)

在所有情况下指针都是左值?什么时候被视为右值?

Dav*_*rtz 15

指针不是可以是右值或左值的东西.指针是一种类型.唯一可以是右值或左值的是表达式.

考虑这个类似的问题:"整数是左值还是右值".嗯,都不是."3"是整数和右值."3 = I;" 是非法的.但是"我= 3;" 如果'i'是整数,则是合法的.所以'i'是一个整数和一个左值.'3'是整数和右值.

  • 是的,*表达式*`p`是一个左值.它也是指针类型.你的问题就像"一个想法有四个字母吗?" 当我说"想法不是那种可以有四个字母的东西"时,你回答"但是*想法*确实有四个字母!".*表达式*可以是左值或右值.指针不能.指针类型的表达式可以是左值或右值,就像*字*可以有四个字母一样,无论是否为"idea". (3认同)
  • 我不确定你究竟在问什么.指针是左值还是左值的规则与任何其他表达式相同.正如"3"是右值,"新foo(3)"是右值.正如"j"是左值,如果'j'是整数类型的变量,那么如果'j'是类型指针的变量,则"j"是左值.就像整数类型的const引用是一个rvalue一样,指向整数的类型指针的const引用也是如此.这种类型无关紧要. (2认同)