考虑以下C++代码:
void* a = &a;
Run Code Online (Sandbox Code Playgroud)
为什么编译器不抱怨使用未声明的标识符?
此外,编译器认为变量a是什么?它是指向void对象的指针还是指向指针的void*指针?
Mat*_* M. 95
C++中变量声明的范围可能非常令人惊讶:
void* a = &a;
^~~~~~~~~~~~~~~~~
a declared as `void*` from here on
Run Code Online (Sandbox Code Playgroud)
因此,&a是void**因为任何指针类型都可以隐式转换为void*......
Sta*_*sik 30
它相当于
void* a;
a = &a;
Run Code Online (Sandbox Code Playgroud)
因此,a已经宣布.所以a得到a写入的地址a.所以它是一个指向void指针的指针.(你还没有定义任何对象.)
In void* a,a被声明为不是void类型的指针,而是"any"类型(特殊情况).当然,地址(存储器中的位置)被分配给a被声明的任何其他变量.
之后,&a计算表达式以初始化a刚刚声明的变量(也是,但这不相关).类型&a是"指向任何类型指针的指针",这是"指向任何类型的指针"的特殊情况,与类型完全兼容a.Ergo,没有编译器消息.
推论:void*如果你想要强类型检查,请不要使用. 任何东西都可以转换成它.反方向恰好相反,除了void*它本身(这是一个不必要的例外,类型与自身不相容).
此外,AFAIR这真的来自C.