ホームページ > バックエンド開発 > C++ > クラス内初期化子が中括弧または代入演算子に制限されているのはなぜですか?

クラス内初期化子が中括弧または代入演算子に制限されているのはなぜですか?

DDD
リリース: 2024-12-21 06:43:14
オリジナル
475 人が閲覧しました

Why Are In-Class Initializers Restricted to Curly Braces or the Assignment Operator?

クラス内初期化子のあいまいさの防止

クラス内初期化子が中かっこで囲むか、代入演算子 (=)?括弧を使用できるメソッド宣言とは異なり、クラス内初期化子はこの特定の構文に従う必要があります。

制限の根拠

この制限は、潜在的な構文を回避することを目的としています。曖昧さ。次のクラス定義を考えてみましょう。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート