std :: array聚合初始化需要大量的花括号

voi*_*ter 8 c++ c++11

我有以下代码:

   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},
      }};
   }
Run Code Online (Sandbox Code Playgroud)

编译,但我不知道为什么.该g_mapping变量需要额外级别的看似冗余的花括号.换句话说,我希望初始化看起来像:

MapType g_mapping = {
   {"POST_MASTER", MessageDeliveryMethod::POST_MASTER},
   {"BUBBLE", MessageDeliveryMethod::BUBBLE},
};
Run Code Online (Sandbox Code Playgroud)

(移除了一层外括号).

我的理解是,在C++ 14之前,当进行直接初始化时,需要额外的括号级别.但是,复制初始化不应该基于此页面需要这个(请查看那里的示例).

有谁能解释一下?

更新:

这个被我的问题推测重复的SO问题确实回答了一些具体和有用的问题(与我自己有关),但是由于使用pair(我认为这最初是导致问题)而导致混乱.我从来没有在第一时间找到那个问题,所以如果我认为也许我说出问题的方式可能会帮助人们从不同的角度来解决问题.

Vla*_*cow 5

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

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

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

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

array<T, N> a = { initializer-list }; 
Run Code Online (Sandbox Code Playgroud)

其中initializer-list是一个逗号分隔的列表,最多包含N个元素,其类型可转换为T.