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

Why is it illegal to define a pointer to pointer variable with constructor invocation notation?

本文关键字:指针 非法 变量 定义 表示 函数调用 为什么      更新时间:2023-10-16

当我使用构造函数调用表示法(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;
}

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

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

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

什么语法规则导致这种情况,即为什么不能使用构造函数调用表示法来定义指向指针的指针,而只能定义"较少指向"的类型?

看起来像有效的C++。而且,正如其他人指出的那样,海湾合作委员会确实接受它。根据您得到的编译器错误,它看起来像MSVC解析器中的错误。

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

Foo*  parFoo = new Foo[2];
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too

在VS2005中,代码可以简化为仅

int main() {
  int** ppFoo(0);
}

它会产生相同的错误。显然,这是编译器中的一个错误。