Что это означает «значение типа» в стандарте C ++ N3337 5.2.10, пункт 7? - PullRequest
0 голосов
/ 28 октября 2018

In C ++ черновой стандарт N3337 сечение 5.2.10 Reinterpret cast пункт 7 ( упорная шахта ):

Anуказатель объекта может быть явно преобразован в указатель объекта другого типа.Когда значение v типа «указатель на T1» преобразуется в тип «указатель на cv T2», результат равен static_cast<cv T2*>(static_cast<cv void*>(v)), если и T1, и T2 являются типами стандартной компоновки (3.9) итребования к выравниванию T2 не являются более строгими, чем требования к T1, или если какой-либо тип является недействительным.

Означает ли это, что выражение v является prvalue ?.Если это так, то

int a = 0x1234;
int *pa = &a;
char *pc = reinterpret_cast<char *>(pa);

Выше, переменная pa является lvalue, поэтому мы можем подумать, что если переменная lvalue находится в правильном выражении, переменная является prvalueтипа?.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

В спецификации используется v для представления выражения.Это не обязательно имя переменной.

В вашем примере указанный абзац не применяется напрямую, потому что pa является lvalue.Вместо этого сначала применяется преобразование lvalue-to-rvalue , затем применяется этот параграф.

0 голосов
/ 28 октября 2018

cppreference ваш друг здесь, если мы перейдем к теме Значения категорий , это скажет нам prvalue это:

prvalue («чисто«Rvalue) - это выражение, вычисление которого либо

  • вычисляет значение операнда оператора (такое prvalue не имеет объекта результата), либо
  • инициализирует объект или битполе (такое prvalue называется объектом результата).Все значения класса и массива имеют объект результата, даже если он отбрасывается.В определенных контекстах происходит временная материализация, чтобы создать временный объект как результат;

Что не является автоматически просветляющим, но обеспечивает очень хороший набор примеров ниже Я приведу некоторые примеры указателей:

Следующие выражения являются выражениями prvalue:

...

  • & a, встроенное выражение адреса;
    ...
  • theэтот указатель;
    ....

Таким образом, приведение этого указателя или результата address-of к константу указателя этого типа будетсоответствовать формулировке (при условии, что она еще не является постоянной), например:

{
  int x = 0;
  const int *p = reinterpret_cast<const int*>(&x);
}
...