9

我需要写入某些整数类型的单个字节。我应该使用reinterpret_cast,还是应该使用static_castvia void*

(一个)

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

根据std::aligned_storage的 static_cast 和 reinterpret_cast 的答案,两者都应该是等价的——

-- 如果 T1 和 T2 都是标准布局类型,并且 T2 的对齐要求不比 T1 严格

我倾向于reinterpret_cast因为这本质上就是我正在做的事情,不是吗?

还有其他需要考虑的事情吗,特别是我们目前正在编译的版本 Visual-C++ 和 VC8?(仅限 x86 自动取款机。)

4

1 回答 1

13

在这种情况下(转换对象指针),reinterpret_cast等同于两个嵌套的static_castviavoid*

5.2.10 重新解释演员表 [expr.reinterpret.cast]

7 对象指针可以显式转换为不同类型的对象指针。72 当对象指针类型的纯右值 v 转换为对象指针类型“指向 cv T 的指针”时,结果为 static_cast<cv T*>(static_cast<cv void*>(v))。将“指向 T1 的指针”类型的纯右值转换为“指向 T2 的指针”类型(其中 T1 和 T2 是对象类型,并且 T2 的对齐要求不比 T1 的对齐要求更严格)并返回其原始类型会产生原始类型指针值。

最好在此处使用reinterpret_cast表明您的意图

更新:正如评论中提到的,这显然是在 C++11 中添加的,尽管大多数 C++98 编译器已经支持它(另见此Q&A

于 2014-07-08T08:28:19.770 回答