考虑以下结构:
struct S { int index; };
可以使用大括号列表将其初始化,如下所示:
S s{10}; //s::index becomes 10
但是,如果我为成员指定默认值:
struct S { int index = -1; };
括号列表初始化给了我一个编译器错误,无法将其转换initializer list
为S
。我怀疑这可能与为该结构生成的默认构造函数有关,因为我已经指定了默认值。但是为什么初始化列表不能覆盖它呢?
我想要这个的原因是我想用值初始化结构或将其默认为一些“无效”的默认值。由于此限制,我必须自己指定一个构造函数,或者每次都显式初始化“无效”默认值。
我正在使用VS2015编译器。
在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聚合初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句