如果我执行以下操作,一切正常:
char* cp = "abc";
void* vp = NULL;
vp = static_cast<void*>(cp);//ok
cp = static_cast<char*>(vp);//ok
但下面不是:
char** cpp = &cp;
void** vpp = NULL;
vpp = static_cast<void**>(cpp);//error C2440: 'static_cast':
//cannot convert from 'char **' to 'void **'
cpp = static_cast<char**>(vpp);//error C2440: 'static_cast':
//cannot convert from 'void **' to 'char **'
有人可以向我解释为什么不允许使用第二个示例。请不要引用 C++ 标准作为你的整个答案,因为我已经看到引用它的答案,但我不明白它们的意思。我想了解为什么第二个示例不起作用(即,如果您能举一个危险的示例,那将是一个很大的帮助)。因为我不明白。对我来说,这两个例子都是指针。为什么额外的间接级别会有所不同?
最佳答案
A void *
指针可以指向“任何东西”,将所有指针转换为 void *
是有效的, 并且从 void *
转换所有指针是有效的到其他类型。
然而,一个void **
是一个指向 void *
的指针值(value)。还有一个 char **
是指向 char *
的指针值(value)。这些类型不指向可相互转换的类型。如果您需要这样做,您可以使用 void **vpp = reinterpret_cast<void **>(cpp);
,但它“不安全”(你基本上是在告诉编译器“看,我知道我在做什么,所以就去做吧”,这可能不会像你实际期望的那样......)
关于c++ - static_cast void* char* 与 static_cast void** char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16280814/