В Проект стандарта 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
типа?
Спецификация использует v
представлять выражение. Это не обязательно имя переменной.
В вашем примере упомянутый вами абзац не применяется напрямую, потому что pa
это значение. Вместо этого преобразование lvalue в rvalue применяется в первую очередь, затем применяется этот пункт.
cppreference ваш друг здесь, если мы перейдем к теме Ценовые категории это говорит нам prvalue является:
prvalue («чистое» rvalue) — это выражение, оценка которого либо
- вычисляет значение операнда оператора (у такого значения нет объекта результата), или
- инициализирует объект или битовое поле (говорят, что такое значение имеет результирующий объект). Все значения класса и массива имеют объект результата, даже если он отбрасывается. В определенных контекстах происходит временная материализация, чтобы создать временный объект как результат;
Что не является автоматически просветляющим, но они обеспечивают очень хороший набор примеры ниже Я приведу некоторые примеры указателей:
Следующие выражения являются выражениями prvalue:
…
- &а, встроенный адрес-выражение;
…- указатель this;
….
Так что кастинг этот указатель или результат address-of к const указателя этого типа будет соответствовать формулировке (при условии, что это еще не const), например:
{
int x = 0;
const int *p = reinterpret_cast<const int*>(&x);
}