Согласно cppreference.com, reinterpret_cast
:
Преобразует между типами, переинтерпретируя базовый шаблон бит.
Но подождите, что ложь заставит его работать только в этих случаях:
Когда указатель или ссылка на объект типа
T1
составляетreinterpret_cast
(или приведение в стиле C) к указателю или ссылке на объект другого типаT2
, приведение всегда выполняется успешно, но полученный указатель или ссылка может быть доступна только в том случае, если оба типаT1
иT2
являются стандартными типами макетов, и одно из следующих значений истинно:
T2
является (возможно, cv-квалифицированным) динамическим типом объектаT2
иT1
- оба (возможно, многоуровневые, возможно, cv-квалификаторы на каждом уровне) указатели на один и тот же типT3
T2
- это (возможно, cv-квалифицированный) подписанный или неподписанный вариант динамического типа объектаT2
- это тип агрегата или тип объединения, который содержит один из вышеупомянутых типов как элемент или нестатический член (включая рекурсивно, элементы субагрегатов и нестатические члены данных объединенных объединений): это делает его безопасным для перевода из первого члена структуры и из элемента объединения в struct/union, который содержит его.T2
является (возможно, cv-квалифицированным) базовым классом динамического типа объектаT2
-char
илиunsigned 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
не обрабатывает это для меня? Или есть что-то еще, поэтому мне не нужно прыгать через этот обруч?