Это реализация, определенная в том смысле, что стандарт не (почти) не предписывает, как значения разных типов должны выглядеть на битовом уровне, как должно быть структурировано адресное пространство и так далее.Так что это действительно очень специфичная платформа для таких преобразований, как:
double d;
int &i = reinterpret_cast<int&>(d);
Однако, как гласит стандарт,
Предполагается, что это не удивительно для тех, кто знает структуру адресации базовой машины..
Так что, если вы знаете, что делаете и как все это выглядит на низком уровне, ничто не может пойти не так.
Состав в стиле C в некотором смысле похожчто он может выполнять reinterpret_cast, но он также сначала «пытается» static_cast и может отбросить квалификацию cv (в то время как static_cast и reinterpret_cast не могут) и выполнить преобразования без учета контроля доступа (см. 5.4 / 4 в стандарте C ++ 11).Например:
#include <iostream>
using namespace std;
class A { int x; };
class B { int y; };
class C : A, B { int z; };
int main()
{
C c;
// just type pun the pointer to c, pointer value will remain the same
// only it's type is different.
B *b1 = reinterpret_cast<B *>(&c);
// perform the conversion with a semantic of static_cast<B*>(&c), disregarding
// that B is an unaccessible base of C, resulting pointer will point
// to the B sub-object in c.
B *b2 = (B*)(&c);
cout << "reinterpret_cast:\t" << b1 << "\n";
cout << "C-style cast:\t\t" << b2 << "\n";
cout << "no cast:\t\t" << &c << "\n";
}
и вот результат от ideone:
reinterpret_cast: 0xbfd84e78
C-style cast: 0xbfd84e7c
no cast: 0xbfd84e78
обратите внимание, что значение, полученное с помощью reinterpret_cast, точно такое же, как и адрес 'c', тогда как стиль Cприведение привело к правильно смещенному указателю.