使用类内成员初始值设定项进行struct初始化

时间:2013-05-28 15:08:52

标签: c++ c++11

我在初始化使用类内初始值设定项的结构时遇到了问题:

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

这应该按照标准运作,还是这实际上是非法的?我是否滥用类内初始化程序?我认为新的语法会使它如此,所以我不必编写构造函数只是为了进行初始化,但现在看来我可能不得不求助于旧的机制来避免未初始化结构的可能性。

1 个答案:

答案 0 :(得分:3)

如果

,您只能使用大括号
  • 大括号内容与构造函数(不是您的情况)匹配,或

  • 该类是聚合,每个大括号元素与类成员匹配。

但是,如果(C ++ 11,8.5.1 / 1):

,则类是聚合
  

非静态成员没有大括号或等号初始化

你的班级显然有的。所以,你也没有聚合。

编写合适的构造函数,或删除大括号或等于初始化函数。