C++ 数组聚合初始化需要大量的花括号

C++ 数组聚合初始化需要大量的花括号,c++,c++11,C++,C++11,我有以下代码: enum class MessageDeliveryMethod { POST_MASTER, BUBBLE, NUM_ENUMERATORS }; namespace { using MapType = std::array< std::pair<char const*, MessageDeliveryMethod>, static_cast&

我有以下代码:

   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},
      }};
   }
(拆下一层外支架)

我的理解是,在C++14之前,在进行直接初始化时,需要额外的大括号级别。但是,复制初始化并不需要基于(请看这里的示例)

有人能解释一下吗

更新:
假设我的问题重复了这一点,但确实回答了一些具体且有用的问题(与我自己的问题相关),但由于使用了
pair
(我认为这一问题最初是由它引起的),上下文之外的我的问题令人困惑。我从来没有在一开始就发现过这样的问题,所以如果我认为有什么问题的话,也许我的问题措辞方式可以帮助人们从不同的角度找到解决方案。

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

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

更精确的,然后按照C++标准(23.3.2.1类模板数组概述)

2数组是一个聚合(8.5.1),可以使用 语法

数组a={初始值设定项列表};
其中,初始值设定项列表是由最多N个元素组成的逗号分隔列表 其类型可转换为T


标准中有23.3.2.1(3)

数组是可以使用以下语法初始化的聚合(8.5.1)

数组a={初始值设定项列表}


这表明,当您使用内部化器列表初始化数组时,需要将其用大括号括起来。

std::array
定义为嵌套聚合—一个包含数组作为其唯一成员的类。在C++14之前,聚合初始化需要两层大括号:一层围绕类成员列表(其中只有一个成员,即数组),另一层围绕数组元素列表。然后,如果要列出初始化每个数组元素,则需要第三级


C++14允许您在初始化嵌套聚合时“展平”列表,如您链接到的页面所述。

Plusone作为标题。括号省略真的是一个。。。disbrace?我编辑了我的帖子,以澄清为什么我不觉得它是重复的。SO版主/社区最近变得非常糟糕,他们没有考虑其他人的观点,而是过早地将问题作为重复的问题关闭。从不同角度到达是为了将重复的问题保留在网站上。这不是一个问题,这导致现有的答案。谢谢,这是有道理的。这似乎是
std::array
的设计问题。我建议可以通过简单地为
std::initializer\u list
提供构造函数重载来解决这个问题,但这会使它成为所需的非聚合类型。不确定解决方案是什么,但现在使用起来有点尴尬。
std::pair
不是聚合。@remyabel:不是;但它仍然可以被初始化。我在描述为什么需要外部两级大括号,而不是每对
初始化器周围的大括号。std::array上有大量重复的大括号,需要两组大括号,但在这个特定场景中,不能忽略任何大括号。@remyabel:可以用其他形式的初始化替换每对大括号周围的大括号。我不太清楚你想表达什么观点;我对这个问题的理解是,它问的是外两对。抱歉,如果你希望我找到一个重复的而不是直接回答问题。我所说的重复评论的意思是,这个问题似乎不同,因为它涉及非聚合类型,因此答案应该相应不同。“其中,初始值设定项列表是由最多N个元素组成的逗号分隔列表,这些元素的类型可转换为T。”
MapType g_mapping = {
   {"POST_MASTER", MessageDeliveryMethod::POST_MASTER},
   {"BUBBLE", MessageDeliveryMethod::BUBBLE},
};
array<T, N> a = { initializer-list };