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


当我使用构造函数调用表示法(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 标识符位于错误的位置。

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


5894
2017-12-10 18:44


起源

适合我。也许这是一个VisualC ++的东西。 - Robᵩ
第一个例子使用ideone.com编译好(我想是gcc)。至于第二个你可能犯了一个错误,应该是Foo ** ppFoo2(ppFoo)? < - 注意ppFoo。实际上在第一个例子中也存在错误(重复的名称),但那是次要的。 - queen3
对于ideone.com的建议,@ queen3 +1,非常酷,并且可以发现拼写错误。现在修好了;问题依然存在。 - zyndor


答案:


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

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

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

12
2017-12-10 18:54



这是一个报告的错误吗? - nullpotent
感谢您的回复和解决方案解决方案。 - zyndor
@iccthedral:我不知道。 - ybungalobill


在VS2005中,代码可以简化为单纯

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

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


2
2017-12-10 19:38