C++ でのあいまいなステートメントの解決

C++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

関連参照

IBM Copyright 2003