如何无效*a =&合法?

use*_*063 88 c++

考虑以下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)

因此,&avoid**因为任何指针类型都可以隐式转换为void*......

  • @ user2681063`a =&userfulObject`? (22认同)
  • @MarkGarcia:注意`void*a = a;`如果在本地声明则为UB,否则在命名空间范围内就可以了. (4认同)

Sta*_*sik 30

它相当于

void* a;
a = &a;
Run Code Online (Sandbox Code Playgroud)

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

  • 从技术上讲,您确实定义了一个对象.`a`本身就是一个对象.(并非所有对象都在C++中具有用户定义的类型) (9认同)
  • @Gusdor我们只能假设超出事件视界的空白. (3认同)

Mar*_*ssi 7

In void* a,a被声明为不是void类型的指针,而是"any"类型(特殊情况).当然,地址(存储器中的位置)被分配给a被声明的任何其他变量.

之后,&a计算表达式以初始化a刚刚声明的变量(也是,但这不相关).类型&a是"指向任何类型指针的指针",这是"指向任何类型的指针"的特殊情况,与类型完全兼容a.Ergo,没有编译器消息.

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

此外,AFAIR这真的来自C.