【问题标题】:Difference Between reinterpret_cast Usagereinterpret_cast 用法之间的区别
【发布时间】: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


    【解决方案1】:

    是的,因为隐式数组到指针的转换。

    第一次尝试转换指针;因此数组被转换为一个指针(指向它的第一个元素)以允许该转换。然后你取消引用指针,写入数组的字节。

    第二个将对数组的引用转换为对整数的引用;对该引用的赋值再次覆盖数组的字节。

    如果你用非数组类型尝试这个,第一个不会编译;在转换该指针之前,您必须明确获取地址 &amp;a

    【讨论】:

    • 为什么 reinterpret_cast<:int16_t>(a) 甚至可以工作? a 是 char* 类型(因为 char a[] 只是语法糖),我认为将指针重新解释为引用不是一个好主意。我的想法哪里错了?
    • @Daerst:不,a 不是 char*,数组也不是“语法糖”。 char[2] 是一个包含两个字节的聚合类型;强制转换将这些字节(不是指针)重新解释为两字节整数。
    • 谢谢你的澄清,我好像有什么误解。
    • @MikeSeymour - 谢谢迈克。一位同事说参考更安全,但我不这么认为。
    • @MikeSeymour:想了想,我想我对char[2]a[i] 感到困惑。后者确实与*(a + i) 相同(如有错误请指正),这意味着a 本身就是一个指针。在这里用作指针的这个东西被重新解释为上面的引用,这对我来说没有意义。
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多