C++ 11:正确的std :: array初始化?

Byz*_*ian 60 c++ arrays initialization c++11 c++14

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

std::array<int, 4> a = {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题:

std::array<int, 4> a = {{1, 2, 3, 4}};
Run Code Online (Sandbox Code Playgroud)

这是警告信息:

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]
Run Code Online (Sandbox Code Playgroud)

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

Pub*_*bby 44

这是以下的简单实现std::array:

template<typename T, std::size_t N>
struct array {
    T __array_impl[N];
};
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Sam有不同的含义.您发布的语法是创建一个std :: arrays(一个二维数组)数组,而不是一个数组(1维). (5认同)

Dra*_*ter 30

根据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"} };
Run Code Online (Sandbox Code Playgroud)

  • @cyberpunk_只有在您的编译器实现[DR#1270](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1270)时才解除该限制. (4认同)
  • @cyberpunk_你可以用额外的大括号来满足它.这不是GCC唯一令人烦恼的警告(曾经见过`建议围绕'&&'在'|''内的括号?) (3认同)
  • 该警告意味着编译器编写者认为您可能不够聪明,无法正确使用该语言功能。 (2认同)

Ami*_* G. 6

在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 =
Run Code Online (Sandbox Code Playgroud)

std :: array参考


Cir*_*四事件 6

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

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

主程序

#include <array>

int main() {
    std::array a{1, 2, 3};
}
Run Code Online (Sandbox Code Playgroud)

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

测试:

g++ -ggdb3 -O0 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp
Run Code Online (Sandbox Code Playgroud)

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

error: missing template arguments before ‘a’
Run Code Online (Sandbox Code Playgroud)

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

在 Ubuntu 18.04、GCC 7.5.0 上测试。