1

クラス内イニシャライザを使用する構造体の初期化に問題があります。

struct A
{
    int a{};
    int b{};
};

struct B
{
    int a;
    int b;
};

int main()
{
    A a;    // OK
    B b{1, 2}; // OK
    B b2; // OK, but b.a and b.b are undefined
    A a2{1, 2}; // ERROR!
}

gcc 4.7.2 から得られるエラーは次のとおりです。

% g++ -std=c++11 test2.cc
test2.cc: In function ‘int main()’:
test2.cc:16:11: error: no matching function for call to ‘A::A(<brace-enclosed initializer list>)’
test2.cc:16:11: note: candidates are:
test2.cc:1:8: note: constexpr A::A()
test2.cc:1:8: note:   candidate expects 0 arguments, 2 provided
test2.cc:1:8: note: constexpr A::A(const A&)
test2.cc:1:8: note:   candidate expects 1 argument, 2 provided
test2.cc:1:8: note: constexpr A::A(A&&)
test2.cc:1:8: note:   candidate expects 1 argument, 2 provided

これは標準に従って動作するはずですか、それとも実際には違法ですか? クラス内イニシャライザの使用を悪用していますか? この初期化を行うためだけにコンストラクターを作成する必要がないように、新しい構文でうまくいくと思っていましたが、初期化されていない構造の可能性を回避するために、その古いメカニズムに頼らなければならないようです。

4

1 に答える 1

3

次のいずれかの場合にのみ中括弧を使用できます

  • ブレースの内容がコンストラクターと一致する (あなたのケースではない)、または

  • クラスは集約であり、各ブレース要素はクラス メンバーと一致します。

ただし、(C++11、8.5.1/1) の場合、クラスは集約です。

非静的メンバーのブレースまたはイコール初期化子はありません

あなたのクラスは明らかに持っています。したがって、集計もありません。

適切なコンストラクターを作成するか、ブレースまたはイコール初期化子を削除してください。

于 2013-05-28T15:16:09.380 に答える