【问题标题】:I don't know why I can't initialize an array of an array in C++我不知道为什么我不能在 C++ 中初始化一个数组的数组
【发布时间】:2021-08-18 21:21:37
【问题描述】:

我有这段 C++ 代码:

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

它说:错误:结构初始化程序中的多余元素

我不知道为什么会这样。如果我写它有效:

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

【问题讨论】:

    标签: c++ arrays c++11 initialization aggregate-initialization


    【解决方案1】:

    要初始化std::array 对象,您需要两个花括号对:外花括号用于对象本身,内花括号用于数组。

    这意味着你的初始化需要看起来像

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

    【讨论】:

      【解决方案2】:

      std::arrayaggregate initialization 中是微妙的;它期望子对象(底层数组)有更多大括号。

      std::array<std::array<int, 2>, 4> elements = {{{1,2},{1,2},{1,2},{1,2}}};
      //                                           ^                         ^ <- for std::array
      //                                            ^                       ^  <- for underlying array
      

      初始化器 {{1,2},{1,2},{1,2},{1,2}} 出现错误,因为有 4 个 {1,2}s 来初始化子对象(底层数组),但 std::array 只有一个,即多余的元素。

      【讨论】:

        【解决方案3】:

        以下是一些示例,您可以如何初始化您正在使用的类型的对象。

        #include <iostream>
        #include <array>
        
        int main() 
        {
            std::array<std::array<int, 2>, 4> elements1 = { 1, 2, 1, 2, 1, 2, 1, 2 };
            std::array<std::array<int, 2>, 4> elements2 = { { 1, 2, 1, 2, 1, 2, 1, 2 } };
            std::array<std::array<int, 2>, 4> elements3 = 
            { 
                { 
                    { 1, 2 }, { 1, 2 }, { 1, 2 }, { 1, 2 }
                }           
            };
            
            std::array<std::array<int, 2>, 4> elements4 = 
            { 
                { 
                    { { 1, 2 } }, { { 1, 2 } }, { { 1, 2 } }, { { 1, 2 } }
                }           
            };
            
            std::array<std::array<int, 2>, 4> elements5 = 
            { 
                {
                    { 1, 2 }, 1, 2, 1, 2, { 1, 2 }
                }           
            };
        
            return 0;
        }
        

        注意以下来自 C++ 17 标准(11.6.1 聚合)的引用

        12 大括号可以在初始化列表中被省略,如下所示。如果 initializer-list 以左大括号开头,然后是后面的 初始化子句的逗号分隔列表初始化元素 子聚合的;有更多是错误的 初始化子句比元素。但是,如果初始化器列表 对于子聚合不以左大括号开头,那么就足够了 列表中的初始化子句用于初始化元素 子集合的;任何剩余的初始化子句都留给 初始化当前聚合的下一个元素 子聚合是一个元素。

        std::array 定义为包含另一个聚合的聚合。

        这是一个演示程序,使引用更清晰,显示了二维数组的初始化

        #include <iostream>
        
        int main() 
        {
            const size_t M = 4, N = 4;
            int a[M][N] =
            {
                { 1, 2, 3, 4 },
                5, 6, 7, 8,
                { 8, 7, 6, 5 },
                4, 3, 2, 1,
            };
            
            return 0;
        }
        

        您可以将std::array&lt;std::array&lt;int, 2&gt;, 4 &gt; 类型的表示想象为以下演示程序中结构 B 的声明。

        #include <iostream>
        
        struct A
        {
            int a[2];
        };
        
        struct B
        {
            A b[4];
        };
        
        int main() 
        {
            B b1 = 
            {
                
            };
            
            B b2 =
            {
                {
                }
            };      
        
            B b3 =
            {
                {
                    {
                    }
                }
            };      
        
            B b4 =
            {
                {
                    {
                        { {}, {} }
                    }
                }
            };      
        
            return 0;
        }
        

        调查程序。

        【讨论】:

        • 我不明白你的代码为什么有效。它是一个数组数组,数组的每个元素都是一个数组,用 {} 表示。
        • @MartíSerra 请参阅我的回答中提供的 C++ 17 标准的引用。
        猜你喜欢
        • 2012-01-07
        • 2014-09-21
        • 2017-01-07
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多