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

新手上路,请多包涵

如果我按如下方式初始化 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 版本中的一个错误,还是故意这样做的?如果是这样,为什么?

原文由 Byzantian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

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

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

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

原文由 Pubby 发布,翻译遵循 CC BY-SA 3.0 许可协议

C++17 std::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 上测试。

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题