我需要写一些整数类型的单个字节。我应该使用reinterpret_cast
,还是应该通过static_cast
使用void*
?
(a)中
unsigned short v16;
char* p = static_cast<char*>(static_cast<void*>(&v16));
p[1] = ... some char value
p[0] = ... some char value
或(b)
unsigned short v16;
char* p = reinterpret_cast<char*>(&v16);
p[1] = ... some char value
p[0] = ... some char value
根据static_cast and reinterpret_cast for std::aligned_storage&#39; answer,两者都应该相同 -
- 如果T1和T2都是标准布局类型和对齐方式 T2的要求不比T1更严格。
我倾向于reinterpret_cast
因为 基本上就是我在做什么,不是吗?
还有其他需要考虑的事项,特别是我们目前正在编译的Visual-C ++和VC8版本吗? (x86只有atm。)
答案 0 :(得分:13)
在这种情况下(转换对象指针),reinterpret_cast
与两个嵌套static_cast
通过void*
5.2.10重新解释演员[expr.reinterpret.cast]
7可以将对象指针显式转换为对象指针 一个不同类型的.72当对象指针类型的prvalue v是 转换为对象指针类型“指向cv T的指针”,结果是 的
static_cast<cv T*>(static_cast<cv void*>(v))
即可。转换prvalue 键入“指向T1的指针”到“指向T2的指针”(其中T1和T2为 对象类型以及T2的对齐要求为否 比T1更严格,并回到原来的类型产生 原始指针值。
最好在此处使用reinterpret_cast
表示您的意图。
UPDATE :正如评论中所提到的,这显然是在C ++ 11中添加的,尽管大多数C ++ 98编译器已经支持它(另请参阅this Q&A)