Языковой адвокат — Что означает «значение типа» в стандарте 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 применяется в первую очередь, затем применяется этот пункт.

0

Другие решения

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

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

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

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

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

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

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

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

По вопросам рекламы [email protected]