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

无效指针

我有以下代码:

   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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

容器std :: array的列表初始化需要双括号

std :: array的嵌套聚合初始化

用花括号初始化一个std :: array的元组

用单花括号而不是双花括号初始化 std::vector 替换

在g ++上进行聚合初始化的std :: array会生成大量代码

用花括号初始化std :: vector使用初始化列表

std :: array大括号如何初始化?

初始化std :: array的std :: array

std::array 派生类聚合初始化

带双花括号的向量初始化:std :: string vs int

初始化std :: array <>

使用嵌套的初始化程序列表聚合子对象的std :: array的初始化

如果需要将数组清零,用一对大括号初始化std :: array是否正确?

接收 std::pair 作为参数并从花括号列表初始化推导出类型的模板化函数

默认初始化std :: array?

值初始化std :: array成员?

用'this'指针初始化std :: array

在函数内部初始化std :: array

初始化std :: array <struct,size>

使用std :: vector进行std :: array初始化

初始化std :: string的std :: vector

初始化 std::memset

为什么C ++会用零初始化std :: vector而不初始化std :: array?

类中的 std::list 变量是否需要初始化?

std :: tuple和std :: pair支持聚合初始化吗?

通过std :: initializer_list初始化std :: pair在初始化std :: array时不起作用吗?

初始化std :: pair <double,std :: array <std :: pair <double,double>,3>>

为什么括号括起来的初始化程序列表不适用于std :: array

用常量值初始化std :: array