我不知道为啥我不能在 C++ 中初始化一个数组的数组

Posted

技术标签:

【中文标题】我不知道为啥我不能在 C++ 中初始化一个数组的数组【英文标题】: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;

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

std::array 在aggregate 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,2s 来初始化子对象(底层数组),但 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 标准的引用。

以上是关于我不知道为啥我不能在 C++ 中初始化一个数组的数组的主要内容,如果未能解决你的问题,请参考以下文章

为啥memset不能将数组元素初始化为1?(急)

为啥 C 函数不能返回数组类型? [复制]

为啥dll不能在c++中使用?

为啥 c++ ifstream 不能从设备读取?

为啥我不能在初始化列表中使用箭头运算符?

在 C++ 中初始化动态二维数组