C++ 初始值设定项周围缺少大括号-有效警告? 让我们考虑这个代码: #包括 #包含或按照中的建议,或者上述两行标记的代码是否确实有问题?

C++ 初始值设定项周围缺少大括号-有效警告? 让我们考虑这个代码: #包括 #包含或按照中的建议,或者上述两行标记的代码是否确实有问题?,c++,gcc,compiler-warnings,C++,Gcc,Compiler Warnings,这些错误报告是关于对特殊情况发出警告的毫无帮助的{0},它对初始化C中的任何结构类型有效,因此有时必须使用,因为此类类型未指定 此代码正确无误;警告只是std::array必须包含T[N]类型的成员的常见结果,因此,如果要显式初始化每个级别(有时如果使用其他大括号初始化),则需要额外的大括号。如果你要求你的编译器用-Wmissing-brages对这类事情保持学究式的,它会按照你的要求去做,并警告速记。(std::vector不需要额外的大括号,因为它使用的是初始值设定项列表构造函数,而不是聚合

这些错误报告是关于对特殊情况发出警告的毫无帮助的
{0}
,它对初始化C中的任何
结构
类型有效,因此有时必须使用,因为此类类型未指定


此代码正确无误;警告只是
std::array
必须包含
T[N]
类型的成员的常见结果,因此,如果要显式初始化每个级别(有时如果使用其他大括号初始化),则需要额外的大括号。如果你要求你的编译器用
-Wmissing-brages
对这类事情保持学究式的,它会按照你的要求去做,并警告速记。(
std::vector
不需要额外的大括号,因为它使用的是初始值设定项列表构造函数,而不是聚合初始化。)

所以当你说
对特殊情况{0}
毫无帮助地发出警告时,这难道不意味着警告可能会被视为一个bug吗?@Phil ZXX:是的,而且已经这样报告过了(至少两次),但这不是你的问题,是吗?你没有使用
{0}
。我的问题是,例如
arr.push_back({1,2,3});
上显示的警告是否有效。如果不是,为什么gcc会显示它(那么这个警告是一个bug)?@Phil ZXX:当然这是你的问题,你一开始就说得很清楚。而且,我已经回答了。我还不确定我是否完全理解你的回答。一方面“这个代码是正确的”,另一方面“需要额外的大括号来显式初始化每个级别”。那么,在需要额外大括号的情况下,代码怎么可能是正确的呢?如果代码确实是正确的,那么应该没有警告,不是吗?
<source>:8:27: warning: missing braces around initializer for 'std::__array_traits<int, 3>::_Type' {aka 'int [3]'} [-Wmissing-braces]
    8 |     arr.push_back({ 1,2,3});          // WARNING
   11 |     std::array<int, 3> a1 {1,1,1};    // WARNING