3

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% 合法的吗?

4

2 回答 2

4

a)我相信第一行相当于static_cast<char**>(const_cast<void*>(arg))。并不是说它有什么不同。

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

于 2013-07-16T21:34:52.170 回答
2

是的,它们基本上是相同的,除了 c++ 风格的演员表向代码的读者展示了你正在做一些奇怪的事情,而使用 c 风格更难注意到。

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

于 2013-07-16T21:33:26.630 回答