gpt4 book ai didi

c++ - std::array 聚合初始化需要大量令人困惑的花括号

转载 作者:可可西里 更新时间:2023-11-01 17:50:29 25 4
gpt4 key购买 nike

我有以下代码:

   enum class MessageDeliveryMethod
{
POST_MASTER,
BUBBLE,

NUM_ENUMERATORS
};

namespace
{
using MapType = std::array<
std::pair<char const*, MessageDeliveryMethod>,
static_cast<std::size_t>(MessageDeliveryMethod::NUM_ENUMERATORS)
>;

MapType g_mapping = {{
{"POST_MASTER", MessageDeliveryMethod::POST_MASTER},
{"BUBBLE", MessageDeliveryMethod::BUBBLE},
}};
}

这可以编译,但我不知道为什么。 g_mapping 变量需要额外一层看似多余的大括号。换句话说,我希望初始化看起来像:

MapType g_mapping = {
{"POST_MASTER", MessageDeliveryMethod::POST_MASTER},
{"BUBBLE", MessageDeliveryMethod::BUBBLE},
};

(移除了一层外括号)。

我的理解是,在 C++14 之前,在进行直接初始化时需要额外的大括号级别。但是,根据 this page,拷贝初始化不应该要求这样做。 (看看那里的例子)。

谁能解释一下?

更新:

This SO question这被认为是我的问题的重复确实确实回答了一些具体和有用的问题(与我自己有关)但是由于使用 pair (我认为这是导致最初发布)。我一开始就不会发现这个 SO 问题,所以如果有的话,我认为也许我表达问题的方式可能会帮助人们从不同的角度找到解决方案。

最佳答案

std::array 被定义为包含数组的结构。

因此第一对大括号用于初始化数组结构的数据成员。第二对大括号用于初始化结构中的数组。第三对大括号用于初始化每个 std::pair 类型的对象。

根据 C++ 标准(23.3.2.1 类模板数组概述)更精确

2 An array is an aggregate (8.5.1) that can be initialized with the syntax

array<T, N> a = { initializer-list }; 

where initializer-list is a comma-separated list of up to N elements whose types are convertible to T.

关于c++ - std::array 聚合初始化需要大量令人困惑的花括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com