2017-12-05 7 views
4

私はC++パーサ(実際はそれの小さなサブセット)を作成していますが、変数の初期化でカンマ演算子が使用できない理由を説明できません。宣言内のコンマ演算子

int a = 1, 2; // throws a "Expected ';' at the end of declaration" compiler error 
a = 1, 2; // assigns the result of the comma binary operator to the a (2) 
int a = (1, 2); // does the same as above, because paren expression is allowed as an initializer 

C++仕様では、変数宣言で式を初期化子として使用できます。コンマバイナリ表現は許可されませんが、優先度の高い他のすべての式は許可されるのはなぜですか? cppreference.com(http://en.cppreference.com/w/cpp/language/initialization)は、任意の式を初期化子として使用できると述べています。

C++仕様の第8.5節では、初期化子に代入式しか含めることができないと述べています。これは、割り当てが初期化で許容される最低優先順位式であることを規制する場所ですか?

+2

あなたはコンパイラの作家が嫌い?これは、 'int i = 1,2、j = 3;'を解析するときにどこに残されますか? – StoryTeller

+0

"これは、割り当てが初期化で許容される最低優先順位式であることを規制する場所ですか?"はい。 –

+0

@ n.m。カンマ式が許可されていない理由は何ですか? –

答えて

4

言語の文法は、すなわち、フォームの、カンマ区切りの宣言子条項として初期化子でカンマを解釈します

int i = 2, j = 3; 

その曖昧さを回避するには、カッコ内にカンマ式をラップする必要があります。 [dcl.decl]から

[...] 
init-declarator-list: 
    init-declarator 
    init-declarator-list , init-declarator 
[...] 
+0

これは、コンマ演算子を初期化子として使用することはできませんが、paren式を使用する必要があり、paren式はコンマサブ式を持つことが許可されていることを意味します。 –

+0

@ElvissStrazdins - 確かに、文法の観点から、それは本当です。私は私の答えを調整します。 –

+0

initializer-listはbraced-init-listでしか使用できないので、これは私の質問とは関係ありません。私はequal-initializerについて質問しています。 –

関連する問題