2016-09-06 110 views
20

初始化具有默认值的结构体结构是简单的:括号(集合)初始化为具有默认值

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

和初始化用支架初始化一个结构是微不足道的太:

X x = {1, 3}; 

令人惊奇的init代码不会编译,直到我删除默认值。那么,我如何在这种情况下做init?我想让X POD没有C-tor。

+4

只是FYI:与C++ 14,代码编译。 – Mine

+1

记录在这里:http://en.cppreference.com/w/cpp/language/aggregate_initialization – Hayt

+2

'聚合的定义被改为显式排除任何具有成员初始值的类;因此,他们不允许使用聚合初始化。 C++ 14放宽了此限制,允许在这些类型上进行聚合初始化。如果加载的初始化列表没有为该参数提供一个值,那么成员初始化程序就会处理它,所以基本上,如果没有C-tor,C++ 11中不可能存在代码。只有C++ 14 –

回答

18

下面是一些与问题相关的文档:

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

你的代码是无效的。在它再次有效。

在C++ 11中添加一个默认的初始化可以防止braced init有效。在C++ 14中,它没有。

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

+0

在我原来的答案中有一些错误信息。编辑它到正确的解决方案,但留下原来的答案,因为POD性能似乎也与OP – Hayt

+0

相关我编辑了**原始**和**编辑**部分,合并部分仍然有效的一旦编辑的部分在那里,原始的一个。如果有人想看历史,他们可以点击历史链接。我的修改是否保留了原来的意图?如果没有,请随时回滚,但我建议您放弃编辑/原始模式。 – Yakk

+0

消息仍然相同。当时我认为这很好(当信息没有upvotes并且不被接受时)向OP表示我的初步答案不是他正在寻找的答案。现在它被接受+这里唯一的答案,我可以看到,这是更好的方式。 – Hayt