8 Expressions [expr]

8.2 Postfix expressions [expr.post]

8.2.10 Reinterpret cast [expr.reinterpret.cast]

Результат выражения reinterpret_­cast<T>(v) - это результат преобразования выражения v в тип T. Если это ссылочный тип lvalue или ссылка rvalue на тип функции, результатом будет lvalue; если это ссылка rvalue на тип объекта, результатом будет xvalue; в противном случае результатом является prvalue , и для выражения выполняются стандартные преобразования . Преобразования, которые можно выполнить явно с помощью , перечислены ниже. Никакое другое преобразование не может быть выполнено явно с помощью . T T lvalue-to-rvalue array-to-pointer function-to-pointer v reinterpret_­cast reinterpret_­cast

reinterpret_­cast Оператор не должен cast away constness. Выражение целочисленного типа, типа перечисления, указателя или типа указатель на член может быть явно преобразовано в его собственный тип; такое приведение дает значение своего операнда.

[ Note: Отображение, выполненное с помощью, reinterpret_­cast может, а может и не дать представление, отличное от исходного значения. ]end note

Указатель может быть явно преобразован в любой целочисленный тип, достаточно большой, чтобы вместить его. Функция сопоставления определяется реализацией. [ Note: Предполагается, что это неудивительно для тех, кто знает структуру адресации базовой машины. ] Значение типа может быть преобразовано в целочисленный тип; преобразование имеет то же значение и действительность, что и преобразование в целочисленный тип. [ A нельзя использовать для преобразования значения любого типа в тип . ]end note std​::​nullptr_­t (void*)0 Note: reinterpret_­caststd​::​nullptr_­t end note

Значение целочисленного типа или типа перечисления может быть явно преобразовано в указатель. Указатель, преобразованный в целое число достаточного размера (если такое существует в реализации) и обратно в тот же тип указателя, будет иметь свое исходное значение; сопоставления между указателями и целыми числами в противном случае определяются реализацией. [ Note: За исключением случаев, описанных в [basic.stc.dynamic.safety], результатом такого преобразования не будет безопасно полученное значение указателя. ] end note

Указатель на функцию можно явно преобразовать в указатель на функцию другого типа. [ Note: Эффект от вызова функции через указатель на тип функции ([dcl.fct]), который не совпадает с типом, используемым в определении функции, не определен. ] За исключением того, что преобразование prvalue типа «указатель на » в тип «указатель на » (где и являются типами функций) и обратно к исходному типу дает исходное значение указателя, результат такого преобразования указателя не указан. [ См. Также более подробную информацию о преобразованиях указателей. ]end note T1T2 T1 T2 Note: [conv.ptr] end note

Указатель объекта может быть явно преобразован в указатель объекта другого типа.73 Когда prvalue v типа указателя объекта преобразуется в тип указателя объекта «указатель на cv T», результатом является static_­cast<cv T*>(static_­cast<cv void*>(v)). [ Note: Преобразование prvalue типа «указатель на T1» в тип «указатель на T2» (где T1 и T2 являются типами объектов и где требования к выравниванию T2 не строже, чем у T1) и обратно в исходный тип дает исходное значение указателя. ]end note

Преобразование указателя функции в тип указателя объекта или наоборот поддерживается условно. Значение такого преобразования определяется реализацией, за исключением того, что если реализация поддерживает преобразования в обоих направлениях, преобразование prvalue одного типа в другой тип и обратно, возможно, с другой квалификацией cv, должно дать исходное значение указателя.

null pointer value Преобразуется в значение указателя нулевого типа назначения. [ Note: Константа нулевого указателя типа std​::​nullptr_­t не может быть преобразована в тип указателя, а константа нулевого указателя целочисленного типа не обязательно преобразуется в значение нулевого указателя. ]end note

Prvalue типа «указатель на член X типа T1» может быть явно преобразован в prvalue другого типа «указатель на член Y типа T2», если T1 и T2 являются типами функций, или обоими типами объектов. Преобразуются в значение указателя члена нуля типа назначения. Результат этого преобразования не указан, за исключением следующих случаев:74 null member pointer value

  • преобразование prvalue типа «указатель на функцию-член» в другой указатель на тип функции-члена и обратно в исходный тип дает исходный указатель на значение элемента.

  • преобразование prvalue типа «указатель на элемент данных X типа T1» в тип «указатель на элемент данных Y типа T2» (где требования к выравниванию T2 не строже, чем у T1) и обратно к исходному типу дает исходный указатель на значение члена.

Выражение типа glvalue типа T1 может быть приведено к типу «ссылка на T2», если выражение типа «указатель на T1» может быть явно преобразовано в тип «указатель на T2» с помощью reinterpret_­cast. Результат относится к тому же объекту, что и исходное значение glvalue, но с указанным типом. [ Note: То есть, для lvalues, ссылка литой reinterpret_­cast<T&>(x) имеет тот же эффект, что и преобразование *reinterpret_­cast<T*>(&x) с помощью встроенного & и * операторы (и аналогично для reinterpret_­cast<T&&>(x)). ] Нет временно создаются, копия не сделана, и или не называется. end noteconstructors conversion functions 75

Типы могут иметь разные cv-qualifiers, с учетом общего ограничения, что a reinterpret_­cast не может отбросить константность.

T1 и T2 может иметь разные cv-qualifiers, с учетом общего ограничения, что a reinterpret_­cast не может отбросить константность.

Иногда его называют файлом type pun.