繁体   English   中英

不知道为什么不能在C++中初始化一个数组

[英]I don't know why I can't initialize an array of an array in C++

我在 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}};

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

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

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

std::array聚合初始化中很微妙; 它期望子对象(底层数组)有更多的大括号。

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}用于初始化子对象(基础数组) 但std::array只有一个,即多余的元素。

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

#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 个大括号,如下所示。 如果初始化器列表以左大括号开头,则随后的初始化器子句的逗号分隔列表初始化子聚合的元素; 初始化子句多于元素是错误的。 但是,如果子聚合的初始化器列表不以左大括号开头,则仅从列表中获取足够的初始化器子句来初始化子聚合的元素; 剩下的任何初始化子句都被留下来初始化当前子聚合是其元素的聚合的下一个元素。

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<std::array<int, 2>, 4 >的表示想象为以下演示程序中结构 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;
}

调查程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM