reinterpret_cast与static_cast在标准布局类型中写入字节?

时间:2014-07-08 08:22:49

标签: c++ c++11 reinterpret-cast visual-c++-2005 standard-layout

我需要写一些整数类型的单个字节。我应该使用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。)

1 个答案:

答案 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