为什么默认成员值禁止使用括号列表初始化?

时间:2016-05-25 20:23:45

标签: c++ struct visual-studio-2015

考虑这个结构:

struct S { int index; };

可以使用括号列表进行初始化,如下所示:

S s{10}; //s::index becomes 10

但是,如果我为成员指定默认值:

struct S { int index = -1; };

支持列表初始化给我一个编译器错误,它无法将initializer list转换为S。我怀疑它可能与为结构生成的默认构造函数有关,因为我已经指定了默认值。但为什么初始化列表不能覆盖呢?

我想要这个的原因是我想要用值初始化struct或者将它默认为某些“无效”默认值。由于这个限制,我必须自己指定一个构造函数,或者每次都显式初始化“无效”默认值。

我正在使用VS2015编译器。

1 个答案:

答案 0 :(得分:7)

在C ++ 11中,聚合在[dcl.init.aggr]中定义为:

  

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有用于非静态数据成员的大括号或等于初始化程序(9.2),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚函数(10.3)。

由于N3605删除了这个条件(从那时起被重新格式化以将这些条件显示为项目符号列表,因此已经得到了改进。可读性)。

结果,在C ++ 11中,这个:

struct S { int index = -1; };

int main() {
    S s{10};
}

格式错误,因为S不符合聚合条件,因此我们不会尝试进行聚合初始化,并且int没有匹配的构造函数。

但是从C ++ 14开始,S是一个聚合,因此代码格式正确。因此要么你在C ++ 11模式下编译,要么VS2015不支持C ++ 14聚合初始化。