我有以下代码:
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之前,进行直接初始化时,需要额外的花括号。但是,不应根据此页面要求复制初始化(请看那里的示例)。
谁能解释一下?
假定与我的问题重复的SO问题确实回答了一些特定且有用的问题(与我自己的问题有关),但是由于使用的原因pair
(我认为最初是引起问题的原因),我的上下文是令人困惑的。我永远不会首先发现SO问题,所以如果我认为我的问题表达方式可能会帮助人们从不同角度寻求解决方案。
std::array
被定义为包含数组的结构。
因此,第一对花括号用于初始化作为数组的结构的数据成员。第二对大括号用于初始化结构内的数组。第三对大括号用于初始化每个类型为std :: pair的对象。
为了更精确,然后根据C ++标准(23.3.2.1类模板数组概述)
2数组是一个聚合(8.5.1),可以使用以下语法初始化
array<T, N> a = { initializer-list };
其中initializer-list是一个逗号分隔的列表,最多包含N个元素,其类型可转换为T。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句