【发布时间】:2013-12-05 15:42:42
【问题描述】:
根据 GCC 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5),我在以下代码的数组初始化中缺少花括号:
#include <iostream>
#include <boost/array.hpp>
#include <array>
int main(){
int plain[] = {1,2,3,4,5};
std::array <int, 5> std_arr = {1,2,3,4,5}; // warning, see below
boost::array<int, 5> boost_arr = {1,2,3,4,5}; // warning, see below
std::cout << plain[0] << std_arr[1] << boost_arr[2] << std::endl;
}
> g++ test.cc -Wall -Wextra -pedantic --std=c++0x
test.cc: 在函数 »int main()«:
test.cc:7:47:警告:»std::array::value_type [5] {aka int [5]}« [-Wmissing-braces] 的初始化周围缺少花括号
test.cc:8:47:警告:»int [5]« [-Wmissing-braces] 的初始化周围缺少花括号
显然 (GCC missing braces around initializer) 这是 GCC 中的一个错误,即使在稍微不同的上下文中也是如此。答案从“提交错误报告”到“只是禁用警告”不同。
但是,在std::array 或boost::array 的上下文中,这个警告是多余的,还是我遗漏了一些重要的东西?
(我可能会添加额外的大括号而不是禁用警告,但我很好奇其中的含义)
【问题讨论】:
-
这是一个警告。如果它是“必需的”,那将是一个错误。
-
不应该是
std::array<int,5} arr{1,2,3,4,5};吗? (未选中) -
@Alex 不,但
std::array<int,5> arr{1,2,3,4,5};是合法的。 -
@Alex 允许使用
=。 @Zeta 两个大括号是“必需的”,因为数组本身是一个带有内部 C 数组(第二对大括号)的结构(一对大括号)。在这种情况下,标准允许您省略第二对。 -
@Malloc:假设 CWG1270 是固定的。否则还是
std::array<int,5> arr{{1,2,3,4,5}};
标签: c++ gcc-warning