如何使用列表初始化值来初始化聚合类型

问题描述:

如何使用列表初始化语法初始化C++ 14中的聚合类型?如何使用列表初始化值来初始化聚合类型

Aggregate_t {}; 

这被视为聚合初始化,其产生错误或警告的用于未初始化Aggregate_t成员。

这可能吗?

EDIT:实例

struct Aggregate_t { 
    int x; 
}; 

int main (int, char**) 
{ 
    Aggregate_t {}; 
    return 0; 
} 

与克编译++ - 4.9.2:

main.c++: In function ‘int main(int, char**)’: 
main.c++:7:16: warning: missing initializer for member ‘Aggregate_t::x’ [-Wmissing-field-initializers] 
    Aggregate_t {}; 
      ^
+5

请发布[MCVE](http: //stackoverflow.com/help/mcve),以及你得到的错误。 – juanchopanza 2015-02-23 14:01:35

+2

这应该与值初始化具有相同的效果(除非自C++ 11以来发生了一些变化 - 我还没有完全更新)。你真的得到错误,或只是过分热心的警告?另外,请向我们展示'Aggregate_t'的定义,以便我们可以检查它是否真的是一个聚合。 – 2015-02-23 14:02:22

+0

这可能是一个过分热衷的警告,但问题更多地是关于初始化的影响。如果未初始化的聚合初始化成员被初始化(根据标准),那么我想这是我的问题的答案。 – 2015-02-23 14:10:43

[dcl.init.aggr]

7 - 如果有更少的初始化子句中列出的成员数量大于成员总数,则未初始化的每个成员应初始化[C++ 14:从其括号或等值初始化程序或者如果没有括号或等价初始化器,]从一个空的初始化器列表(8.5.4)。

所以g ++是过度热闹的警告;我不知道有什么办法可以避免它,同时在警告有效的情况下保留它,当然除了使用复制初始化和预期的复制省略:

Aggregate_t a = Aggregate_t(); 
+0

我也在cppreference.com中发现它:“如果初始化子句数小于成员数或初始化子句完全为空,则其余成员将通过它们的括号或相等初始值设定项初始化,如果在类中提供定义,否则由空列表执行值初始化。“所以,它通常应该具有与值初始化相同的效果。 – 2015-02-23 18:15:31

+0

这一点不必诉诸于 - ()语法来避免gcc的警告。似乎无法完成,所以,谢谢! – 2015-02-23 18:35:41

+1

正如警告的名称所示,“-Wmissing-field-initializers”适用于缺少初始化程序 - 即使正在初始化基础的东西(按照[手册](https://gcc.gnu.org/) onlinedocs/GCC /警告 - Options.html))。然而它的设计有例外,空括号就是其中之一。根据我的经验,GCC并不擅长这一点,所以如果你确信它不会隐藏错误,我会推荐'-Wno-missing-field-initializers'。 – 2015-02-25 10:11:54