static_cast wchar_t*to int*或short* - 为什么它是非法的?

Voi*_*ter 4 c++ casting wchar-t

在Microsoft VC2005和g ++编译器中,以下结果都会导致错误:

在win32 VC2005上:sizeof(wchar_t)是2

wchar_t *foo = 0;
static_cast<unsigned short *>(foo);
Run Code Online (Sandbox Code Playgroud)

结果是

error C2440: 'static_cast' : cannot convert from 'wchar_t *' to 'unsigned short *' ...
Run Code Online (Sandbox Code Playgroud)

在Mac OS X或Linux上g ++:sizeof(wchar_t)为4

wchar_t *foo = 0;
static_cast<unsigned int *>(foo);
Run Code Online (Sandbox Code Playgroud)

结果是

error: invalid static_cast from type 'wchar_t*' to type 'unsigned int*'
Run Code Online (Sandbox Code Playgroud)

当然,我总是可以使用reinterpret_cast.但是,我想了解为什么编译器认为static_cast到适当的整数类型是非法的.我确信有充分的理由......

Log*_*ldo 6

您无法在不相关的指针类型之间进行转换.指向的类型的大小是无关紧要的.考虑类型具有不同对齐要求的情况,允许这样的强制转换可能会在某些处理器上生成非法代码.指向不同类型的指针也可能具有不同的大小.这可能导致您获得的指针无效或指向完全不同的位置.如果你知道你的程序编译器arch和os你可以侥幸逃脱,那么Reinterpret_cast是你所遇到的逃脱舱口之一.

  • 成员函数指针通常是一个很好的例子.例如,对于MSVC,指针将根据类是否具有虚函数而具有不同的大小. (3认同)