繁体   English   中英

带有嵌套初始化列表的子对象的 std::array 的聚合初始化

[英]Aggregate initialization of std::array of subobjects with nested initializer lists

使用嵌套的花括号初始化器列表初始化聚合类型(例如std::array )及其子对象的正确方法是什么? 我不想直接调用子类型的构造函数。

这是一个反复出现的问题,我总是惊讶于下面的代码不起作用,因为指定了元素的类型,因此编译器可以推断出正确的构造函数。

请注意,示例类型A不必是聚合(但当然它必须支持花括号初始化器列表)。

#include <array>    

struct A
{
    int values[4];
};

int main()
{
    std::array<A, 2> arr{{ 0, 1, 2, 3 }, { 4, 5, 6, 7 }};

    // Works only if A is an aggregate, also looks confusing, I don't want to do this
    //std::array<A, 2> arr{ 0, 1, 2, 3, 4, 5, 6, 7 };

    // I don't want to do this neither
    //std::array<A, 2> arr{A{ 0, 1, 2, 3 }, A{ 4, 5, 6, 7 }};

    return 0;
}

但我得到的只是错误

error: too many initializers for 'std::array<A, 2ul>'

您可以在子对象的初始化周围添加大括号,例如

std::array<A, 2> arr{{{ 0, 1, 2, 3 }, { 4, 5, 6, 7 }}};

std::array<A, 2> arr{{ 0, 1, 2, 3 }, { 4, 5, 6, 7 }}; 不起作用,因为对于括号省略

嵌套初始化器列表周围的大括号可以省略(省略),在这种情况下,根据需要使用尽可能多的初始化器子句来初始化相应子聚合的每个成员或元素,随后的初始化器子句用于初始化以下成员目的。

请注意,第一个初始值设定项子句{ 0, 1, 2, 3 }可用于整个std::array内部数组的初始化(其余元素将被初始化为零)。 然后{ 4, 5, 6, 7}成为多余的子句。

暂无
暂无

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

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