11

ポインターへのポインターを定義するコンストラクター呼び出し表記(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は間違った場所にある識別子であることを意味します。

これを引き起こす構文規則は何ですか。つまり、コンストラクター呼び出し表記を使用して、ポインターへのポインターを定義できず、「ポイントが少ない」タイプのみを定義できるのはなぜですか。

4

2 に答える 2

12

有効なC++のようです。そして、他の人が指摘したように、GCCはそれを受け入れます。発生するコンパイラエラーによると、MSVCのパーサーのバグのように見えます。

実際、括弧を追加すると、コードを正しく解析するのに役立ちます。

Foo*  parFoo = new Foo[2];
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too
于 2012-12-10T18:54:46.867 に答える
2

VS2005では、コードを単なるものに減らすことができます

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

同じエラーが発生します。明らかに、これはコンパイラのバグです。

于 2012-12-10T19:38:30.507 に答える