Что это означает "значение типа" в стандарте 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);
}