2013-02-17 3 views
6

Я не уверен, было ли это задано раньше, но, должно быть, я верю. Рассмотрим простую линию для начала вопрос:Как static_cast может использовать int для char, но не reinterpret_cast?

int a ; 
char b = reinterpret_cast<char> (a); 

reinterpret_cast Я понимаю интерпретировать биты шаблон типа х, как типа у, он не Ответ конечно должен работать из-за несоответствия размера и на самом деле это не так.

Теперь рассмотрим этот другой код:

int a ; 
char b = static_cast<char> (a); 

Это работает! , Теперь мой вопрос, как он может работать? Я имею в виду, компилятор отбивает биты? , Я уверен sizeof(char) < sizeof(int). Если это, reinterpret_cast также должен работать по той же методике?

ответ

6

Существует четко определенное преобразование от int до char; это то, что static_cast. На самом деле вам не нужен бросок; вы можете просто использовать назначение здесь. С другой стороны, reinterpret_cast говорит, что притворяется, что биты в объекте одного типа представляют объект другого типа; для некоторых типов это нормально (более или менее), но нет разумного способа сделать вид, что биты в int могут использоваться как биты в символе без применения преобразования, а reinterpret_cast этого не делает.

+0

* "... и' reinterpret_cast' не делает этого "*. какая часть спецификации говорит, что? – Nawaz

+4

@Nawaz, часть, которая определяет конверсии, разрешенные 'reinterpret_cast', очевидно, где вы ожидаете, что она это скажет? [expr.reinterpret.cast] «Конверсии, которые могут быть выполнены явно с использованием' reinterpret_cast', перечислены ниже. ** Нет другое преобразование может быть выполнено явно с использованием 'reinterpret_cast'. **« –

+0

Несмотря на кажущуюся широту его имени, reinterpret_cast' довольно ограничен. Как отмечает @JonathanWakely, есть список вещей, которые он может сделать (в основном вещи, содержащие указатели и ссылки), и больше ничего не разрешено. 5.2.10 [expr.reinterpret.cast]. Совсем не похоже на C-стиль ... –

3

static_cast может либо принудительно преобразовать определенную конверсию, либо перевернуть определенное преобразование (кроме добавления или удаления константы/volatile). Вы думаете, что reinterpret_cast - это супер-бросок, который может что-то сделать. Это не относится к делу. Он имеет набор определенных преобразований.

Он может преобразовывать указатели одного типа в указатель другого (при сохранении const/volatile). Аналогичным образом это можно сделать и для ссылок. Он может накладывать указатели на интегральные типы и наоборот.

Кроме этого, он НЕ делает ничего, и ваша программа не имеет правильной формы.

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