1

次のコードを検討してください。

class A
{
private:
    struct B { private: int i; friend class A; };

public:
    static void foo1()
    {
        B b;
        b.i = 0;
    }

    static void foo2()
    {
        B b = {0};
    }
};

foo1は機能するがfoo2は機能しないのはなぜですか?クラスAの構造体初期化コンストラクターは表示されませんか?これをC++11で機能させる方法はありますか?

(プライベートを削除すると、foo2が機能することに注意してください。)

4

1 に答える 1

3

なぜ機能するのにfoo1機能しないのfoo2ですか?構造体初期化コンストラクターがクラスに表示されませAんか?

B b = {0};

は集計Bではないため、機能しません。また、非静的なプライベートデータメンバーがあるため、集約ではありません。プライベート指定子を削除すると、は集約になり、この方法で初期化できます。B


C ++ 03標準8.5.1
パラ7の骨材:

リスト内の初期化子が集約内のメンバーよりも少ない場合、明示的に初期化されていない各メンバーは値初期化されます(8.5)。[例:

 struct S { int a; char* b; int c; };
 S ss = { 1, "asdf" };

、、、および形式の式の値、つまり。で初期化しss.aます。]1ss.b"asdf"ss.cint()0

C ++ 03標準8.5.1§1

アグリゲートは、ユーザーが宣言したコンストラクター(12.1)、プライベートまたは保護された非静的データメンバー(11節)、基本クラス(10節)、仮想関数(10.3節)を持たない配列またはクラス(9節)です。 )。

于 2012-11-25T13:54:59.250 に答える