Указатель является lvalue или rvalue? - PullRequest
3 голосов
/ 09 декабря 2011

В другом посте я встречал

(5.2.9 / 8). Значение типа "указатель на член D типа cv1 T" может быть преобразовано в значение типа r ".указатель на член B типа cv2 T ", где B - базовый класс (пункт 10) D,

Обратите внимание на это из языкового стандарта.поэтому мой вопрос,

int i = 0;
int *p = &i;
*p = 1;

Является ли указатель lvalue во всех случаях?Когда это рассматривается как значение?

Ответы [ 2 ]

15 голосов
/ 09 декабря 2011

Указатель - это не та вещь, которая может быть rvalue или lvalue.Указатель имеет тип .Единственное, что может быть rvalue или lvalue, это выражение .

. Рассмотрим аналогичный вопрос: «Является ли целое число lvalue или rvalue».Ну, ни то, ни другое.«3» - это целое число и значение."3 = я;"незаконноНо "я = 3;"допустимо, если 'i' является целым числом.Так что «я» является целым числом и lvalue.«3» - это целое число и значение.

0 голосов
/ 25 апреля 2019

Согласно c стандарту 2011 :

За исключением случаев, когда это операнд оператора sizeof, оператор _Alignof, унарный оператор &, оператор ++,- оператор или левый операнд.оператор или оператор присваивания, lvalue, у которого нет типа массива, преобразуется в значение, хранящееся в назначенном объекте (и больше не является lvalue);это называется преобразованием lvalue.

...

Имя lvalue происходит от выражения присваивания E1 = E2, в котором левый операнд E1 должен быть (изменяемый) lvalue.Возможно, его лучше рассматривать как представление объекта '' значение локатора ''.

, поэтому выражение, состоящее из модифицируемой переменной указателя, может определенно действовать как lvalue, так же как указатель на указатель и так далее:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...