如何无效* a =&合法?

考虑下面的C ++代码:

void* a = &a; 

为什么编译器不抱怨使用未声明的标识符?

另外,编译器认为variablesa是什么? 它是一个指向无效对象的指针,还是指向void*指针的指针?

在C ++中声明variables的范围可能是非常令人惊讶的:

 void* a = &a; ^~~~~~~~~~~~~~~~~ a declared as `void*` from here on 

因此, &avoid**但由于任何指针types都可以隐式转换为void*

这相当于

 void* a; a = &a; 

因此,已经宣布了一个。 所以得到a写在a地址。 所以它是一个指向void指针的指针。 (你还没有定义任何对象。)

void* aa被声明为不是voidtypes的指针,而是“any”types的指针(特例)。 一个地址(在内存中的位置)被分配给a ,当然还有其他正在声明的variables。

之后,expression式&a被评估为初始化刚才声明的variables(也是a ,但这不相关)。 &a的types是“指向任何types的指针的指针”,这是“指向任何types的指针”的特例,与a的types完全兼容。 人类,没有编译器的消息。

推论:如果你想强types检查,不要使用void*任何东西都可以转换成它。 正好相反,除了void*本身(这将是一个不必要的例外,一个types与自身不兼容)。

另外,AFAIR这真的来自C.

void指针指向任何地址都可以。 问题是,当你解除引用。 您必须将其转换为您希望此指针指向的types。