2012-12-10 10 views
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; 
} 

を...そして私は、この時間は、それは間違った場所にありますppFoo識別子だということを意味し、C2061を取得します。

これにはどのような構文規則がありますか。つまり、コンストラクタの呼び出し表記をポインタへのポインタの定義に使用できないのはなぜですか?

+4

[私のための作品](http://ideone.com/OlIPKZ)たぶんこれはVisualC++のことです。 –

+1

最初の例はideone.comを使ってうまくコンパイルされました(gccと思います)。おそらく間違いを犯したのは、Foo ** ppFoo2(ppFoo)でしょうか? < - note ppFoo。実際には、最初の例でも(重複した名前の)間違いがありますが、それは軽微です。 – queen3

+0

@ queen3 +1のideone.comの提案については、それは非常にクールで、誤植を見つけるためです。それを今修正しました。問題はそれを持続する。 – zyndor

答えて

12

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

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

これは報告されているバグですか? – nullpotent

+0

返信と回避策のソリューションをありがとう。 – zyndor

+0

@iccthedral:わかりません。 – ybungalobill

2

をVS2005でコードが単なる

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

に低減することができ、それは同じエラーを生成します。括弧を追加実際に

は、それがコードを正しく解析するのに役立ちます。明らかに、コンパイラのバグです。

関連する問題