所以这个 static_cast
代码是完全合法的:
int n = 13;
void* pn = static_cast<void*>(&n);
void** ppn = &pn;
然而,为了编译,这必须转换为 reinterpret_cast
:
int n = 13;
int* foo = &n;
void** bar = static_cast<void**>(&foo);
如果我不改变它,就会出现错误:
错误 C2440:
static_cast
:无法将int **
转换为void **
注意:所指向的类型不相关;转换需要reinterpret_cast
、C风格转换或函数样式转换所以我认为问题在于“类型不相关”。但我仍然不理解,如果从
int*
到void*
是可以的,那么int**
和void**
怎么会不相关呢?
&foo
看作是指向int*
的指针,而bar
是指向void*
的指针。这两种类型非常不同。正是多了一层间接性才使整个区别产生。 - Some programmer dudesizeof(int*)
和sizeof(void*)
甚至不能保证相同。 - Ben Voigtvoid*
和char*
)比需要内存对齐的指针(包括int*
)更大,那么来回传递的要求就可以满足。 - Ben Voigtstatic_cast<void*>
甚至不是一个显式转换,它是显式地执行的隐式转换。 - curiousguy