Что это означает "значение типа" в стандарте C++ N3337 5.2.10, пункт 7?

В C++ проект стандарта N3337 раздел 5.2.10 Reinterpret cast пункт 7 (выделено мной):

Указатель на объект может быть явно преобразован в указатель на объект другого типа. Когда значение 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 ответа

Решение

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

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

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

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

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

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

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

...

  • & a, встроенный адрес-выражения;
    ...
  • указатель this;
    ....

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

{
  int x = 0;
  const int *p = reinterpret_cast<const int*>(&x);
}
Другие вопросы по тегам