C++ 構文は、式ステートメントと宣言ステートメントの間のあいまいさを明確化していません。
式ステートメントの左端の副次式に関数スタイル・キャストがあると、あいまいさが生じます。
(C では、関数スタイルのキャストをサポートしないため、C プログラムではこのようなあいまいさは起きません。) ステートメントを宣言または式のいずれにも解釈できる場合、
ステートメントは宣言ステートメントとして解釈されます。
以下の式は、あいまいな副次式の後に、代入または演算子が続いているため、式ステートメントとして解決されます。 これらの式の type_spec は、任意の型指定子にすることができます。
type_spec(i)++; // expression statement type_spec(i,3)<<d; // expression statement type_spec(i)->l=24; // expression statement
以下の例では、あいまいさを構文的に解決できません。 コンパイラーは、ステートメントを宣言として解釈します。 type_spec は、任意の型指定子です。
type_spec(*i)(int); // declaration type_spec(j)[5]; // declaration type_spec(m) = { 1, 2 }; // declaration type_spec(*k) (float(3)); // declaration
上記の最後のステートメントは、浮動値を用いてポインターを 初期化することができないため、コンパイル時エラーとなります。
上記の規則で解析されないあいまいなステートメントは、デフォルトにより 宣言ステートメントであると見なされます。以下のステートメントはすべて宣言ステートメントです。
type_spec(a); // declaration type_spec(*b)(); // declaration type_spec(c)=23; // declaration type_spec(d),e,f,g=0; // declaration type_spec(h)(e,3); // declaration
関連参照