需求

今天使用统一初始化, {} 初始化 struct 之后,发现数据还是 0,没有初始化进去。

解决

经过网上查找之后,找到问题所在,列表初始化只能用于 aggregate, 而 class, struct, union 是否属于 aggregate, 需要满足以下几个条件:

  • 无自定义构造函数
  • 无私有或受到保护的非静态数据成员
  • 无基类
  • 无虚函数
  • 类的定义中,不能有被 {}= 直接初始化的非静态数据成员
// 自定义构造函数
struct Test {
    int x;
    int y;
    Test(int, int) {}
};

// 保护非静态数据成员
struct Test {
    int x;
    int y;
protected:
    int z;
};

// 基类
struct base{};
struct Test : base {
    int x;
    int y;
};

// 虚函数
struct Test {
    int x;
    int y;
    virtual void func(int, int) {}
};

// 直接初始化
struct Test {
    int x;
    int y = 5;
};

所以只要注意以上几点即可,但是如果一定要这种情况下还要能使用列表进行初始化,也是可以的,需要如下定义:

struct Test {
    int x;
    int y = 5;
    Test(int i, int j) : x(i), y(j) {}
};

参考

C++11新特性之列表初始化

C++ 不能用初始值设定项列表初始化非聚合错误