首页 文章

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

提问于
浏览
50

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

3 回答

  • 42

    这是 std::array 的裸实现:

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

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

    在某些情况下允许使用括号省略进行聚合初始化(但通常不推荐),因此在这种情况下只能使用一个支撑 . 看这里:C++ vector of arrays

  • 28

    根据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"} };
    
  • 3

    C 11中需要双括号,但从C 14开始不需要:

    // construction uses aggregate initialization
    std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 (not in C++14)
    std::array<int, 3> a2 = {1, 2, 3};  // never required after =
    

    std::array reference

相关问题