为什么使用构造函数调用表示法定义指针变量的指针是非法的?

zyn*_*dor 11 c++

当我使用构造函数调用表示法(declare-)定义指向指针的指针(而不是赋值表示法 - 当然在运行时会做同样的事情;它只是一个约定),我得到编译器错误.我想知道为什么会这样.

struct  Foo 
{ /* ... */ };

int main(int argc, char** argv)
{
  Foo*  parFoo = new Foo[2];
  Foo** ppFoo(&parFoo); // invalid: C2059
  Foo** ppFoo = &parFoo; // OK

  delete[] parFoo;
}
Run Code Online (Sandbox Code Playgroud)

错误是C2059 - 无效令牌,但没有说太多.但是,这&不是问题(意味着它可能不是运算符优先级错误).如果我执行以下操作:

int main(int argc, char** argv)
{
  Foo*  parFoo = new Foo[2];
  Foo** ppFoo = &parFoo; // OK
  Foo** ppFoo2(ppFoo); // invalid: C2061

  delete[] parFoo;
}
Run Code Online (Sandbox Code Playgroud)

...然后我得到一个C2061,这意味着这次它ppFoo是错误位置的标识符.

什么语法规则导致这一点,即为什么不能使用构造函数调用符号来定义指针的指针,只有"程度较低"的类型?

ybu*_*ill 12

它看起来像有效的C++.并且,正如其他人所指出的那样,GCC确实接受了它.根据您获得的编译器错误,它看起来像MSVC解析器中的错误.

实际上添加括号有助于它正确解析代码:

Foo*  parFoo = new Foo[2];
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too
Run Code Online (Sandbox Code Playgroud)