当我使用构造函数调用表示法(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
标识符在错误的地方。
什么语法规则导致这一点,即为什么不能使用构造函数调用表示法来定义指针指针,只有“程度较低”的类型?
答案 0 :(得分:12)
它看起来像有效的C ++。并且,正如其他人所指出的那样,GCC确实接受了它。根据编译器错误,它看起来像是MSVC解析器中的错误。
实际上,添加括号有助于它正确解析代码:
Foo* parFoo = new Foo[2];
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too
答案 1 :(得分:2)
在VS2005中,代码可以简化为
int main() {
int** ppFoo(0);
}
并生成相同的错误。显然这是编译器中的一个错误。