【问题标题】:is char** x = (char**) arg equivalent to reinterpret_cast<char**>(const_cast<void*>(arg) )?char** x = (char**) arg 是否等同于 reinterpret_cast<char**>(const_cast<void*>(arg) )?
【发布时间】:2013-07-15 06:27:13
【问题描述】:

a) X1 和 X2 是否相等?如果不是,应该如何进行显式的重新解释/常量转换?

 void some_legacy_function(const void* arg) {
    char** X1 = (char**) arg;
    char** X2 = reinterpret_cast<char**>(const_cast<void*>(arg)  ); 
    /* not surprisingly, indexing into X1 randomly crashes in release build */
 }

b) 这个演员表对我来说似乎很奇怪,在某些情况下它实际上是 100% 合法的吗?

【问题讨论】:

    标签: c++ casting const-correctness reinterpret-cast


    【解决方案1】:

    a) 第一行相当于static_cast&lt;char**&gt;(const_cast&lt;void*&gt;(arg)),我相信。并不是说它有什么不同。

    b) 好吧,如果 arg 确实指向一个 char* 数组,则它是合法的。如果一个reinterpret_casts 是一个指向 U* 指针的 T* 指针(对于任意类型的 T 和 U,相关或其他类型)并返回 T*,则可以保证返回原始值。所以是的,人们可以构建一个可以使用此代码的示例。当然,这并不意味着函数设计得很好。

    【讨论】:

      【解决方案2】:

      是的,它们基本上是相同的,只是 c++ 样式转换向代码的读者显示您正在做一些奇怪的事情,而 c 样式更难注意到。

      当一个 const 传入参数被强制转换为非 const 时,它是合法的,但一如既往地高度怀疑。

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 2018-08-07
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        相关资源
        最近更新 更多