【问题标题】:Brace (aggregate) initialization for structs with default values具有默认值的结构的大括号(聚合)初始化
【发布时间】:2016-09-06 21:27:45
【问题描述】:

使用默认值初始化结构很简单:

struct X { int a; int b = 2; };

使用大括号初始化器初始化结构也很简单:

X x = {1, 3};

令人惊讶的是,在我删除默认值之前,初始化代码不会编译。那么,在这种情况下我将如何进行初始化呢?我想保留 X 一个没有 c-tor 的 POD。

【问题讨论】:

  • 仅供参考:使用 c++14,代码可以编译。
  • The definition of aggregates was changed to explicitly exclude any class with member initializers; therefore, they are not allowed to use aggregate initialization. C++14 relaxes this restriction allowing aggregate initialization on such types. If the braced init list does not provide a value for that argument, the member initializer takes care of it 所以基本上你的代码在没有 C-tor 的 C++11 中是不可能的。仅在 C++14 中

标签: c++ c++11


【解决方案1】:

这里是一些与问题相关的文档:

http://en.cppreference.com/w/cpp/language/aggregate_initialization

中,您的代码无效。在 中再次有效。

在 C++11 中,添加默认初始化会阻止大括号初始化有效。在 C++14 中,它没有。

在 C++11 中解决问题的一种方法是编写一个构造函数,其值为 a,b 值为默认值。

【讨论】:

  • 我的原始答案中有一些错误信息。将其编辑为正确的解决方案,但保留原始答案,因为 POD 似乎也与 OP 相关
  • 我编辑了 originaledited 部分,一旦编辑的部分在那里,合并在原始部分中仍然有效的部分。如果有人想查看历史记录,他们可以单击历史记录链接。我的修改是否保持了您的初衷?如果没有,请随时回滚,但我鼓励您放弃编辑/原始模式。
  • 消息还是一样。我当时认为很好(当消息没有投票并且没有被接受时)向 OP 表明我最初的答案不是他正在寻找的答案。现在它被接受了+这里唯一的答案我可以看到这样更好。
猜你喜欢
  • 2014-07-31
  • 2013-09-25
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2013-08-23
  • 2019-01-11
相关资源
最近更新 更多