【发布时间】:2015-03-04 08:09:11
【问题描述】:
这两个 cast 语句是否相同?它们产生相同的结果。
const std::int16_t i = 3;
char a[ 2 ];
*reinterpret_cast<std::int16_t*>(a) = i;
reinterpret_cast<std::int16_t&>(a) = i;
【问题讨论】:
标签: c++ reinterpret-cast
这两个 cast 语句是否相同?它们产生相同的结果。
const std::int16_t i = 3;
char a[ 2 ];
*reinterpret_cast<std::int16_t*>(a) = i;
reinterpret_cast<std::int16_t&>(a) = i;
【问题讨论】:
标签: c++ reinterpret-cast
是的,因为隐式数组到指针的转换。
第一次尝试转换指针;因此数组被转换为一个指针(指向它的第一个元素)以允许该转换。然后你取消引用指针,写入数组的字节。
第二个将对数组的引用转换为对整数的引用;对该引用的赋值再次覆盖数组的字节。
如果你用非数组类型尝试这个,第一个不会编译;在转换该指针之前,您必须明确获取地址 &a。
【讨论】:
a 不是 char*,数组也不是“语法糖”。 char[2] 是一个包含两个字节的聚合类型;强制转换将这些字节(不是指针)重新解释为两字节整数。
char[2] 和a[i] 感到困惑。后者确实与*(a + i) 相同(如有错误请指正),这意味着a 本身就是一个指针。在这里用作指针的这个东西被重新解释为上面的引用,这对我来说没有意义。