考虑以下C ++代码:
void* a = &a;
为什么编译器不抱怨使用未声明的标识符?
另外,编译器认为变量a是什么?是指向空对象的指针还是指向指针的void*指针?
Answers:
C ++中变量声明的范围可能非常令人惊讶:
void* a = &a;
^~~~~~~~~~~~~~~~~
a declared as `void*` from here on
因此,&a是void**,因为任何指针类型都可以隐式转换为void*...
a = &userfulObject?
void *a = a;如果在本地声明,它将是UB,否则在命名空间范围内就可以了。
相当于
void* a;
a = &a;
因此,a已被声明。因此a获取a写入的地址a。因此,它是指向空指针的指针。(您尚未定义任何对象。)
a本身就是一个对象。(并非所有对象在C ++中都有用户定义的类型)
在中void* a,a被声明为不是指向void类型的指针,而是指向“任何”类型的指针(特殊情况)。a当然,对于要声明的任何其他变量,将地址(在内存中的位置)分配给。
之后,&a将对expression 求值以初始化a刚刚声明的变量(也与无关,但这并不相关)。的类型&a为“指向任何类型的指针”,这是“指向任何类型的指针”的特例,与的类型完全兼容a。嗯,没有编译器消息。
结论:void*如果要进行强类型检查,请不要使用。 任何东西都可以转换为它。反向相反,除了void*它本身(类型与其自身不兼容是不必要的例外)。
另外,AFAIR确实来自C。