结构体的花括号(聚合)初始化方式,带有默认值。

38

使用默认值初始化结构体是微不足道的:

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

并且使用大括号初始化结构体也很简单:

X x = {1, 3};

令人惊讶的是,初始化代码在删除默认值之前无法编译。那么,在这种情况下,我该如何进行初始化? 我希望保持X作为一个没有构造函数的POD。


4
顺便提一下:使用C++14,这段代码可以编译通过。 - Mine
1
在这里记录了聚合初始化的相关信息:http://en.cppreference.com/w/cpp/language/aggregate_initialization - Hayt
4
聚合体的定义已经更改,明确排除任何具有成员初始化器的类;因此,它们不允许使用聚合初始化。C++14放宽了这个限制,允许在这种类型上使用聚合初始化。如果大括号初始化列表没有为该参数提供值,则成员初始化器会处理它。因此,在C++11中,您的代码如果没有构造函数是无法实现的,只有在C++14中才可以。 - Hatted Rooster
1个回答

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

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

中,你的代码是无效的。在中,它又变得有效了。

在C++11中,添加默认初始化会防止花括号初始化变为有效。在C++14中,则不会。

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


在我的原始答案中有一些错误信息。我已经编辑了正确的解决方案,但保留了原始答案,因为POD性质似乎也与OP相关。 - Hayt
我编辑了原始编辑部分,将仍然有效的部分与编辑后的部分合并到原始部分中。如果有人想查看历史记录,可以单击历史链接。我的修改是否保留了您的原始意图?如果没有,请随意回滚,但我鼓励您放弃编辑/原始模式。 - Yakk - Adam Nevraumont
信息仍然是一样的。当时(当信息没有赞和未被接受时)我认为向OP表明我的初始答案不是他所寻找的是一个好主意。现在它被接受并且这里是唯一的答案,我可以看到这样做更好。 - Hayt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接