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%合法吗?
答案 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时,它的合法性一如既往地高度怀疑。