2

次のコード スニペットを書いたところ、 codepad.orgで実行するとコンパイル エラーが発生しました。

int main()
{
int *p = new int(5,6,7);
return 0;
}

メモリを動的に割り当てながら、 int のコンストラクターに3つの引数を渡していました(私によれば、これは機能しないはずです)。

しかし、Visual Studio 2010 コンパイラで同じコードを実行すると、最後の引数で値がコンパイルおよび初期化されます。なぜこれがこのように機能するのですか?

4

2 に答える 2

1

VS2010 は共通演算子を呼び出し、最後の値を正しく割り当てています。

http://en.wikipedia.org/wiki/Comma_o​​perator

gccの場合、これを試してください

int main()
{
 int *p = new int((5,6,7));
 return 0;
}
于 2013-07-21T09:44:43.337 に答える
0

VS2010 は不適合です (驚き)。(5,6,7)inはnew-initializernew int(5,6,7)です。C++11 §5.3.4/15 によると:

type のオブジェクトを作成するnewTは、次のようにそのオブジェクトを初期化します。

  • new-initializerを省略した場合、オブジェクトはデフォルトで初期化されます (8.5) 。初期化が実行されない場合、オブジェクトの値は不定です。

  • それ以外の場合、new-initializerは直接初期化の 8.5 の初期化規則に従って解釈されます。

§8.5/13 には次のように記載されています。

初期化されるエンティティにクラス型がない場合、括弧で囲まれた初期化子の式リストは単一の式になります。

例の式リスト5,6,7は複数の式があるため、コンパイラはこれをエラーとして診断する必要があります。

于 2013-07-21T15:29:19.693 に答える