プログラムがそのようなものであったかどうかを検討してください。
typedef struct A { int m; } A;
int main() { A a( A() ); }
これは有効なCであり、Cの文法で許可される解釈は1つだけa
です。関数として宣言されています。Cは、=
(括弧ではなく)を使用した初期化のみを許可A()
し、式として解釈することはできません。(関数スタイルのキャストはC ++のみの機能です。)これは、Cの「vexingparse」ではありません。
ウィキペディアが指摘しているように、C++の文法はこの例を曖昧にします。ただし、C ++でこのプログラムにCと同じ意味を持たせたい場合は、明らかに、C++コンパイラはa
Cコンパイラと同じように関数として解釈する必要があります。確かに、C ++はこのプログラムの意味を変更してa
、型の変数の定義を作成した可能性がありますA
。ただし、Cとの非互換性は、正当な理由がある場合にのみC ++に導入されました。また、Stroustrupは、C ++に移行するCユーザーに大きなフラストレーションを与えるため、このような潜在的にサイレントな破損を特に避けたいと考えていました。
したがって、C ++はそれを変数定義ではなく、関数宣言としても解釈します。より一般的には、関数スタイルのキャストのように見えるものが、構文コンテキストではなく宣言として解釈できる場合は、そうなるという規則を採用しました。これにより、Cで利用できない解釈(つまり、関数スタイルのキャストを含む解釈)が行われないようにすることで、すべての厄介な状況でCとの非互換性の可能性が排除されます。
Cfront 2.0の選択された読み取り(1-42ページ)では、式宣言のあいまいさの場合のC互換性の問題について説明しています。これは、最も厄介な解析の関連タイプです。