【问题标题】:initialize std::array <struct, size>初始化 std::array <struct, size>
【发布时间】:2021-03-19 10:41:33
【问题描述】:

我正在尝试定义和初始化一个结构数组。

#include <iostream>
#include <array>

int main() {
    struct row{
        double a0;
        double a1;
    };

    //method 0: this way works
    row c[2] ={{1.0,2.0},{3.0,4.0}};

    //method 1: declare and initialization in same line 
    //std::array<row, 2> a = { {1.0, 2.0}, {3.0, 4.0} };//error: Excess elements in struct initializer
    std::array<row, 2> a = {{ {1.0, 2.0}, {3.0, 4.0} }}; //double brace


    //method 2, declare, then initialize in different line
    std::array<row, 2> b;
    //b = { {1.0, 2.0}, {3.0, 4.0} };//error: No viable overloaded '='
    b = { { {1.0, 2.0}, {3.0, 4.0} } }; //double brace

    return 0;
}

现在我发现 this post 的双括号有效。

只是想知道为什么我们需要额外的大括号来初始化结构数组?

【问题讨论】:

标签: c++ arrays struct


【解决方案1】:

您尝试用于初始化/分配std::array 变量的文字(没有双括号)与这些数组的类型不匹配。您需要明确使每个“顶级”元素成为row 对象,例如:

int main()
{
    struct row {
        double a0;
        double a1;
    };
    
    std::array<row, 2> a = { row{1.0, 2.0}, row{3.0, 4.0} };

    std::array<row, 2> b;
    b = { row{1.0, 2.0}, row{3.0, 4.0} };

    return 0;
}

这是因为,如果没有双括号,您的 RHS 文字应该是 std::array&lt;row,2&gt; 类的对象(明确)。但是,使用双括号,您使用的是聚合初始化而不是(复制)赋值(如您链接的帖子中所述)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2015-10-05
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2020-11-01
    相关资源
    最近更新 更多