Согласно cppreference.com, reinterpret_cast
:
Преобразует типы, переинтерпретируя базовый битовый шаблон.
Но подождите, это ложь, потому что это работает только в этих случаях:
When a pointer or reference to object of type
T1
isreinterpret_cast
(or C-style cast) to a pointer or reference to object of a different typeT2
, the cast always succeeds, but the resulting pointer or reference may only be accessed if bothT1
andT2
are standard-layout types and one of the following is true:
T2
— динамический тип объекта (возможно, cv-qualified).T2
иT1
оба (возможно, многоуровневые, возможно, cv-квалифицированные на каждом уровне) указатели на один и тот же типT3
T2
— это подписанный или неподписанный вариант динамического типа объекта (возможно, с указанием cv).T2
— это агрегатный тип или тип объединения, который содержит один из вышеупомянутых типов в качестве элемента или нестатического члена (включая, рекурсивно, элементы подагрегатов и нестатические элементы данных содержащихся объединений): это делает безопасное приведение от первого члена структуры и от элемента объединения до содержащей его структуры/объединения.T2
- это (возможно, cv-квалифицированный) базовый класс динамического типа объектаT2
ischar
orunsigned char
Согласно этому списку незаконным примером будет:
auto foo = 13LL;
auto bar = reinterpret_cast<double&>(foo);
Таким образом, единственный приемлемый способ сделать это приведение — скопировать память:
auto foo = 13LL;
double bar;
copy_n(reinterpret_cast<char*>(&foo), sizeof(foo), reinterpret_cast<char*>(&bar));
Мой вопрос: почему reinterpret_cast
не справится с этим за меня? Или есть что-то еще, чтобы мне не пришлось прыгать через этот обруч?
memcpy
вместоreinterpret_cast<char*>
иcopy_n
? Если побайтовая копия уместна, используйтеmemcpy
, если это не так, то вашcopy_n
тоже не работает. - person Jonathan Wakely   schedule 26.03.2015memcpy
copy_n
, разве это не одно и то же? - person Jonathan Mee   schedule 26.03.2015memcpy
принимаетvoid*
, вам не нужен уродливыйreinterpret_cast
, потому что, еслиfoo
равноconst
, вам не нужно помнить о приведении кconst char*
, так как&foo
просто делает правильную вещь, потому чтоmemcpy
очень сильно оптимизирован, и вы не полагаетесь о реализации, обрабатывающейcopy_n
изchar
объектов одинаково, потому что это легче читать и обычным способом сказать скопировать эти байты отсюда сюда и т. д. и т. д. Я смотрю на этоcopy_n
и думаю, что это делает? - person Jonathan Wakely   schedule 26.03.2015Foo
, но мне нужен код для обработки базового хранилища, как если бы это был типBar
, было бы разумнее сказать Рассматривать этот код как потенциальный косвенный доступ наFoo
или Рассматривайте этот код как потенциальный непрямой доступ ко всем объектам всех типов. Обработка компилятором reinterpret_cast указателя как первого избавит программиста от необходимости кодировать второй. - person supercat   schedule 30.06.2016