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

复活

考虑以下结构:

struct S { int index; };

可以使用大括号列表将其初始化,如下所示:

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

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

struct S { int index = -1; };

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

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

我正在使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果std :: make_unique从未被调用,为什么默认成员初始化中不需要该参数?

来自分类Dev

是否可以在默认成员初始化程序中调用非静态成员函数?

来自分类Dev

非静态数据成员上的成员初始值设定项列表和默认成员初始值设定项有什么区别?

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

由于存在默认成员初始化程序,因此类类型不平凡

来自分类Dev

为什么要为此类初始化程序使用默认值None?

来自分类Dev

为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

来自分类Dev

为什么在括号初始化中允许在参数列表中不允许使用多余的逗号?

来自分类Dev

为什么在删除的默认ctor旁边定义一个空副本ctor会使使用空列表的值初始化失败?

来自分类Dev

用户提供的默认构造函数为什么导致未初始化的成员?

来自分类Dev

为什么不能用括号括起来的初始化程序列表构造gsl :: span

来自分类Dev

为什么std :: atomic的默认构造函数不默认初始化底层存储值?

来自分类Dev

结构中布尔成员的默认初始化值

来自分类Dev

用默认值初始化const类成员

来自分类Dev

为什么派生类的构造函数在初始化列表中使用基类的默认构造函数?

来自分类Dev

初始化禁止复制的成员类

来自分类Dev

为什么初始化程序列表顺序必须与成员声明顺序匹配?

来自分类Dev

为什么编译器会警告不要在初始化列表中隐藏成员?

来自分类Dev

使用花括号初始化程序的默认参数

来自分类Dev

为什么基类的成员不保留构造函数中首次初始化的值?

来自分类Dev

当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

来自分类Dev

使用类成员函数/变量初始化默认参数

来自分类Dev

为什么C ++ 11类内初始化程序不能使用括号?

来自分类Dev

为什么默认(结构值)数组初始化需要复制特征?

来自分类Dev

为什么这个朋友功能不允许大括号初始化列表,但是静态列表允许呢?

来自分类Dev

为什么就地成员初始化在C ++ 11中使用副本构造函数?

来自分类Dev

为什么我们不能在模板静态成员初始化中使用auto?

来自分类Dev

除非使用derect初始化,为什么__dict__不包含类成员?

Related 相关文章

  1. 1

    如果std :: make_unique从未被调用,为什么默认成员初始化中不需要该参数?

  2. 2

    是否可以在默认成员初始化程序中调用非静态成员函数?

  3. 3

    非静态数据成员上的成员初始值设定项列表和默认成员初始值设定项有什么区别?

  4. 4

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  5. 5

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  6. 6

    由于存在默认成员初始化程序,因此类类型不平凡

  7. 7

    为什么要为此类初始化程序使用默认值None?

  8. 8

    为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

  9. 9

    为什么在括号初始化中允许在参数列表中不允许使用多余的逗号?

  10. 10

    为什么在删除的默认ctor旁边定义一个空副本ctor会使使用空列表的值初始化失败?

  11. 11

    用户提供的默认构造函数为什么导致未初始化的成员?

  12. 12

    为什么不能用括号括起来的初始化程序列表构造gsl :: span

  13. 13

    为什么std :: atomic的默认构造函数不默认初始化底层存储值?

  14. 14

    结构中布尔成员的默认初始化值

  15. 15

    用默认值初始化const类成员

  16. 16

    为什么派生类的构造函数在初始化列表中使用基类的默认构造函数?

  17. 17

    初始化禁止复制的成员类

  18. 18

    为什么初始化程序列表顺序必须与成员声明顺序匹配?

  19. 19

    为什么编译器会警告不要在初始化列表中隐藏成员?

  20. 20

    使用花括号初始化程序的默认参数

  21. 21

    为什么基类的成员不保留构造函数中首次初始化的值?

  22. 22

    当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

  23. 23

    使用类成员函数/变量初始化默认参数

  24. 24

    为什么C ++ 11类内初始化程序不能使用括号?

  25. 25

    为什么默认(结构值)数组初始化需要复制特征?

  26. 26

    为什么这个朋友功能不允许大括号初始化列表,但是静态列表允许呢?

  27. 27

    为什么就地成员初始化在C ++ 11中使用副本构造函数?

  28. 28

    为什么我们不能在模板静态成员初始化中使用auto?

  29. 29

    除非使用derect初始化,为什么__dict__不包含类成员?

热门标签

归档