26

クラス内初期化子(C++11 機能) は、中かっこで囲むか、= 記号を続ける必要があります。括弧内に指定することはできません。

これの理由は何ですか?

4

1 に答える 1

43

私はこれについて 100% 肯定的ではありませんが、これは構文のあいまいさを防ぐためかもしれません。たとえば、次のクラスを考えてみます。

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.

    int confusing(Overloaded); // <-- This line
};

表示された行は何を意味しますか? 書かれているように、これは、 (関数宣言で名前が指定されていないconfusing) 型のオブジェクトをパラメーターとして受け取り、Overloadedを返す、という名前のメンバー関数の宣言intです。C++11 で初期化子が括弧を使用できるようにすると、データ member の値に初期化されるint名前付きの型のメンバーの定義になる可能性があるため、あいまいになります。(これは、Most Vexing Parseに関する現在の問題に関連しています。)confusingOverloaded

中括弧を要求することで、このあいまいさがなくなります。

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.

    int confusing{Overloaded}; // <-- This line
};

関数宣言として読み取る方法がないため、confusingが実際にintは の値に初期化されていることは明らかです。Overloaded

お役に立てれば!

于 2013-05-02T03:45:00.583 に答える