微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我不知道为什么我不能在 C++ 中初始化数组的数组

我在 C++ 中有这段代码

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

它说:错误:结构初始化器中的元素过多

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

std::array<std::array<int,2}};

解决方法

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

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

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

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

std::array<std::array<int,2}}};
//                                           ^                         ^ <- for std::array
//                                            ^                       ^  <- for underlying array

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

,

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

#include <iostream>
#include <array>

int main() 
{
    std::array<std::array<int,4> elements1 = { 1,2,1,2 };
    std::array<std::array<int,4> elements2 = { { 1,2 } };
    std::array<std::array<int,4> elements3 = 
    { 
        { 
            { 1,2 },{ 1,2 }
        }           
    };
    
    std::array<std::array<int,4> elements4 = 
    { 
        { 
            { { 1,2 } },{ { 1,2 } }
        }           
    };
    
    std::array<std::array<int,4> elements5 = 
    { 
        {
            { 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,3,4 },5,6,7,8,{ 8,5 },4,};
    
    return 0;
}

您可以将 std::array<std::array<int,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;
}

调查程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。