76

如果我按如下方式初始化 std::array,编译器会给我一个关于缺少大括号的警告

std::array<int, 4> a = {1, 2, 3, 4};

这解决了问题:

std::array<int, 4> a = {{1, 2, 3, 4}};

这是警告信息:

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]

这只是我的 gcc 版本中的一个错误,还是故意这样做的?如果是这样,为什么?

4

4 回答 4

52

这是的裸实现std::array

template<typename T, std::size_t N>
struct array {
    T __array_impl[N];
};

它是一个聚合结构,其唯一数据成员是传统数组,因此内部{}用于初始化内部数组。

在聚合初始化的某些情况下允许大括号省略(但通常不推荐),因此在这种情况下只能使用一个大括号。请参见此处:数组的 C++ 向量

于 2013-01-06T01:13:34.603 回答
39

根据cppreference=仅当省略时才需要双括号。

// construction uses aggregate initialization
std::array<int, 3> a1{ {1,2,3} };    // double-braces required
std::array<int, 3> a2 = {1, 2, 3}; // except after =
std::array<std::string, 2> a3 = { {std::string("a"), "b"} };
于 2013-01-06T01:17:20.883 回答
9

C++17std::array类模板参数推导(CTAD)

这个新的 C++17 特性标准库使用,现在允许我们省略模板类型,以便以下工作:

主文件

#include <array>

int main() {
    std::array a{1, 2, 3};
}

代替std::array<int, 3> a{1, 2, 3};

经测试:

g++ -ggdb3 -O0 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp

-std=c++14例如,如果我们设置,它无法编译:

error: missing template arguments before ‘a’

另请参阅:推断 std::array 大小?

在 Ubuntu 18.04、GCC 7.5.0 上测试。

于 2020-04-22T17:24:27.553 回答
7

CWG 1270 之前的 C++11 中需要双括号(修订后的 C++11 和 C++14 及更高版本中不需要):

// construction uses aggregate initialization
std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 prior to the CWG 1270 revision
                                    // (not needed in C++11 after the revision and in C++14 and beyond)
std::array<int, 3> a2 = {1, 2, 3};  // never required after =

标准::数组引用

于 2018-07-28T03:16:04.703 回答