Статическое приведение просто не правильная вещь. Вы можете выполнять статическое приведение только в том случае, если данные типы являются естественно конвертируемыми. Однако несвязанные типы указателей не неявно преобразуются; то есть 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);