Преобразование / Кастинг между двумя указателями - PullRequest
2 голосов
/ 02 октября 2011

В последнее время я делал много упражнений с файловыми потоками. Когда я использую fstream.write(...) например написать массив из 10 целых чисел (intArr[10]) я пишу:

fstream.write((char*)intArr,sizeof(int)*10);

Безопасен ли (char*)intArr -каст? До сих пор у меня не было никаких проблем с этим, но я узнал о static_cast (способ c ++ правильно?) И использовал static_cast<char*>(intArr), и это не удалось! Что я не могу понять ... Должен ли я изменить свою методологию?

1 Ответ

5 голосов
/ 02 октября 2011

Статическое приведение просто не правильная вещь. Вы можете выполнять статическое приведение только в том случае, если данные типы являются естественно конвертируемыми. Однако несвязанные типы указателей не неявно преобразуются; то есть T* не конвертируется в или из U* в целом. То, что вы действительно делаете, это реинтерпретация приведение:

int intArr[10];

myfile.write(reinterpret_cast<const char *>(intArr), sizeof(int) * 10);

В C ++ приведение в стиле C (char *) становится наиболее подходящим типом доступных преобразований, самым слабым из которых является повторное толкование. Преимущество использования явных приведений в стиле C ++ состоит в том, что вы демонстрируете, что понимаете, какой тип преобразования вам нужен. (Кроме того, нет никакого C-эквивалента const_cast.)

Может быть, полезно отметить различия:

float    q  = 1.5;
uint32_t n  = static_cast<uint32_t>(q);      // == 1, type conversion
uint32_t m1 = reinterpret_cast<uint32_t>(q); // undefined behaviour, but check it out
uint32_t m2 = *reinterpret_cast<const uint32_t *>(&q); // equally bad

Не по теме: правильный способ написания последней строки немного сложнее, но использует обильное количество приведения:

uint32_t m;
char * const pm = reinterpret_cast<char *>(&m);
const char * const pq = reinterpret_cast<const char *>(&q);
std::copy(pq, pq + sizeof(float), pm);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...