2011-01-20 2 views
5

В C++ без страха: Руководство для начинающего, который заставляет вас чувствовать себя умный книги, а в главе (8), он упоминает следующее о reinterpret_castreinterpret_cast

.... новообращенные из одного типа указателя (int) другому (char *). Поскольку кастинг изменяет способ интерпретации данных, на которые он указывает, он называется reinterpret_cast, а не static_cast. *

Можете ли вы описать этот параграф здесь? Особенно причина того, как названа операция?

Спасибо.

+3

Это отличное название для книги! – Joe

+0

Был еще один вопрос сегодня, который вышел из этой книги, и он закончил тем, что делал что-либо, но сделал OP чувствовать себя умным. –

+0

Ах, да, это были вы. http://stackoverflow.com/questions/4746980/c-quitting-a-program Стыдно, что вы решили не брать мой совет о получении реального. –

ответ

6

В основном, reinterpret_cast переинтерпретирует битовый шаблон в определенном месте как другой тип.

Смотрите, например здесь: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc05keyword_reinterpret_cast.htm

«Оператор reinterpret_cast производит значение нового типа, который имеет тот же битовый шаблон в качестве аргумента.»

Статический литье преобразует аргумент вместо того, чтобы просто переинтерпретировать его. Вы можете попробовать это с помощью static_casting и int для float и reinterpret_casting int для float. Результат будет совершенно другим.

+3

Он не обязательно имеет один и тот же бит. В стандарте «reinterpret_cast» очень мало гарантий. 5.2.10/3 говорит: «Отображение, выполняемое' reinterpret_cast', определяется реализацией. [Примечание: оно может или не может выдавать представление, отличное от исходного.] «Кроме того,' reinterpret_cast' не может использовать ' int' в 'float' (он может использовать' int * 'для' float * '). Любая реализация, выполняющая этот приказ, нарушает стандарт (5.2.10/1, последнее предложение), хотя это, вероятно, достаточно распространенное расширение. –

4

Там нет ничего фантастического. это действительно просто предназначено для того, чтобы что-то переосмыслить.

От стандартного 5.3.10, reinterpret_cast призван удовлетворить следующие случаи:

  • Указатель может быть явно преобразован в любой интегральный тип достаточно большой, чтобы удержать его.
  • Значение интегрального типа или типа перечисления может быть явно преобразовано в указатель.
  • Указатель на функцию может быть явно преобразован в указатель на функцию другого типа.
  • Указатель на объект может быть явно преобразован в указатель на другой тип объекта.
  • Преобразование указателя на функцию в указатель на тип объекта или наоборот условно поддерживается.
  • Значение нулевого указателя (4.10) преобразуется в значение нулевого указателя для типа назначения.
  • Prvalue типа «указатель на элемент X типа T1» может быть явно преобразован в prvalue другого типа «указатель на элемент Y типа T2», если T1 и T2 - оба типа функций или оба типа объектов ,
  • Выражение lvalue типа T1 может быть присвоено типу «ссылка на T2», если выражение типа «указатель на T1» может быть явно преобразовано в тип «указатель на T2» с использованием reinterpret_cast. То есть, ссылка литой reinterpret_cast < Т &> (х) имеет тот же эффект, что и преобразование * reinterpret_cast < Т *> (& х) с встроенными & и * операторов (и аналогично для reinterpret_cast < Т & &> (Икс)).
+0

Вы допустили ошибку - это параграф 5.2.10 в стандарте (вы написали 5.3.10) –

+0

Разве номера не могут меняться от пересмотра до версии, кстати? :) – Kos

Смежные вопросы