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