クラス内初期化子のあいまいさの防止
クラス内初期化子が中かっこで囲むか、代入演算子 (=)?括弧を使用できるメソッド宣言とは異なり、クラス内初期化子はこの特定の構文に従う必要があります。
制限の根拠
この制限は、潜在的な構文を回避することを目的としています。曖昧さ。次のクラス定義を考えてみましょう。
class BadTimes { struct Overloaded; int Overloaded; // Strange but legal data member int confusing(Overloaded); // Function declaration or data member initialization? };
クラス内初期化子に括弧が許可されている場合、このコードはあいまいさをもたらします。一方で、「int混乱(Overloaded);」という行は、これは、Overloaded 型のパラメータを受け取り、int を返す関数宣言として解釈される可能性があります。一方、オーバーロードされたデータ メンバーの値を使用した int 型のデータ メンバー初期化として読み取ることもできます。 (これは、悪名高い「最も厄介な解析」問題に関連しています。)
中括弧による曖昧さの排除
中括弧の使用を強制することにより、この曖昧さは排除されます。
class BadTimes { struct Overloaded; int Overloaded; // Strange but legal data member int confusing{Overloaded}; // Clearly a data member initialization };
混乱を招くのは明らかです。関数宣言として解釈する余地がないため、明示的に Overloaded の値に初期化された int。
この構文制限により、明確で明確なクラス定義が保証され、構文の混乱から生じる予期せぬ結果が防止されます。
以上がクラス内初期化子が中括弧または代入演算子に制限されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。