初始化程序周围缺少大括号 - 有效警告?
Missing braces around initializer - Valid warning?
让我们考虑一下这段代码:
#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,2}}; // All good
std::vector<int> a3 {3,3,3}; // All good
std::vector<int> a4 {{4,4,4}}; // All good
return 0;
}
一切都正确编译,并且所有向量和数组都包含预期的元素。
然而,当在 gcc 中使用标志 -Wmissing-braces
时(使用 10.2 测试)我们得到:
<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
为什么 gcc 显示此警告?根据 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119 or https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80454 as suggested in How to repair warning: missing braces around initializer?,这是一个 bug,还是上面标记的 2 行 确实有问题?
那些错误报告是关于对特殊情况 {0}
无益地发出警告,这对在 C 中初始化 any struct
类型是有效的,因此有时 必须 使用,因为这种类型未指定。
此代码是正确的;该警告只是 std::array<T,N>
必须 包含 类型 T[N]
的成员的通常结果,因此如果您想显式初始化每个级别,则需要额外的大括号(有时如果正在使用其他大括号初始化)。如果你要求你的编译器迂腐关于-Wmissing-braces
这样的事情,它会按照你的要求去做,并对shorthand发出警告。 (std::vector<int>
不需要额外的大括号,因为它使用的是初始化列表 构造函数 ,而不是聚合初始化。)
让我们考虑一下这段代码:
#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,2}}; // All good
std::vector<int> a3 {3,3,3}; // All good
std::vector<int> a4 {{4,4,4}}; // All good
return 0;
}
一切都正确编译,并且所有向量和数组都包含预期的元素。
然而,当在 gcc 中使用标志 -Wmissing-braces
时(使用 10.2 测试)我们得到:
<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
为什么 gcc 显示此警告?根据 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119 or https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80454 as suggested in How to repair warning: missing braces around initializer?,这是一个 bug,还是上面标记的 2 行 确实有问题?
那些错误报告是关于对特殊情况 {0}
无益地发出警告,这对在 C 中初始化 any struct
类型是有效的,因此有时 必须 使用,因为这种类型未指定。
此代码是正确的;该警告只是 std::array<T,N>
必须 包含 类型 T[N]
的成员的通常结果,因此如果您想显式初始化每个级别,则需要额外的大括号(有时如果正在使用其他大括号初始化)。如果你要求你的编译器迂腐关于-Wmissing-braces
这样的事情,它会按照你的要求去做,并对shorthand发出警告。 (std::vector<int>
不需要额外的大括号,因为它使用的是初始化列表 构造函数 ,而不是聚合初始化。)