【发布时间】:2013-04-29 14:10:20
【问题描述】:
如果我执行以下操作就可以了:
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++ 标准作为您的全部答案,因为我已经看到引用它的答案,但我不明白它们的意思。我想了解为什么第二个例子不起作用(即,如果你能举一个危险的例子,那将是一个很大的帮助)。因为我不明白。对我来说,这两个例子都是投射指针。为什么额外的间接级别会产生任何影响?
【问题讨论】:
-
您可以将任何指针隐式转换为
void *,并反向静态转换。但是对于T*和U*来说,情况并非如此,它们是不相关的。 (现在想想T = char*和U = void*。) -
您可以将
char**转换为void*,反之亦然。 -
@Kerrek SB - 是的,但为什么不允许这样做?什么时候会不安全?
标签: c++ casting static-cast