初始化器周围缺少大括号 - 有效警告?

问题描述

让我们考虑一下这段代码

z = (x - mean) / std

一切都正确编译,所有向量和数组都包含预期的元素。

然而,在 gcc 中使用标志 #include <vector> #include <array> int main() { std::vector<std::array<int,3>> arr; arr.push_back({ 1,2,3}); // WARNING arr.push_back({{4,5,6}}); // All good std::array<int,3> a1 {1,1,1}; // WARNING std::array<int,3> a2 {{2,2}}; // All good std::vector<int> a3 {3,3,3}; // All good std::vector<int> a4 {{4,4,4}}; // All good return 0; } 时(用 10.2 测试)我们得到:

-Wmissing-braces

为什么 gcc 会显示这个警告?这是https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119 中建议的https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80454How to repair warning: missing braces around initializer? 中的错误,还是确实存在错误标记为 2上面几行?

解决方法

那些错误报告是关于对特殊情况 {0} 发出无益的警告,这对于在 C 中初始化任何 struct 类型是有效的,因此有时必须 被使用是因为这样的类型未被指定。

这个代码是正确的;警告只是 std::array<T,N> 必须包含 T[N] 类型的成员的通常结果,因此如果您想显式初始化每个级别(有时如果正在使用其他大括号初始化)。如果您使用 -Wmissing-braces 要求您的编译器对此类事情迂腐,它会按照您的要求执行操作,并对速记发出警告。 (std::vector<int> 不需要额外的大括号,因为它使用的是初始化列表构造函数,而不是聚合初始化。)