是char ** x =(char **)arg相当于reinterpret_cast <char **>(const_cast <void *>(arg))?</void *> </char **>

时间:2013-07-16 21:26:54

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

a)X1和X2是否相同?如果没有,应该如何进行显式重新解释/ const转换?

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

2 个答案:

答案 0 :(得分:4)

a)我相信第一行相当于static_cast<char**>(const_cast<void*>(arg))。并不是说它有任何区别。

b)嗯,如果arg确实指向一个char *数组,这是合法的。如果一个reinterpret_cast是指向U *指针的T *指针(对于任意类型T和U,相关或其他)并返回到T *,则保证返回原始值。所以是的,可以构建一个这个代码可以工作的例子。当然,这并不意味着功能设计得很好。

答案 1 :(得分:2)

是的,它们基本相同,只不过c ++样式演员表示代码的读者你正在做一些奇怪的东西,而用c风格更难注意到。

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

相关问题