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

时间:2015-03-19 16:47:29

标签: 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},
      }};
   }

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

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

(移除了一层外括号)。

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

任何人都能解释一下吗?

更新:

推测被我的问题复制的

This SO question确实回答了一些具体而有用的问题(与我自己有关)但是由于使用了pair而导致混淆不清楚我认为最初导致问题)。我从来没有在第一时间找到这个问题,所以如果我认为或许我所说的问题可能会帮助人们从不同的角度来解决问题。

3 个答案:

答案 0 :(得分:5)

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

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

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

  

2数组是一个聚合(8.5.1),可以用它初始化   语法

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

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

答案 1 :(得分:2)

std::array被定义为嵌套聚合 - 一个包含数组作为其唯一成员的类。在C ++ 14之前,聚合初始化需要两个级别的大括号​​:一个围绕类成员列表(其中只有一个成员,数组),以及一个围绕数组元素列表。那么你需要第三级,如果你想在列表中初始化每个数组元素。

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

答案 2 :(得分:0)

在标准中我们有23.3.2.1(3)

  

数组是可以使用语法

初始化的聚合(8.5.1)      

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

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