我们可以在 C++14 中省略 std::array 的双括号吗?

Posted

技术标签:

【中文标题】我们可以在 C++14 中省略 std::array 的双括号吗?【英文标题】:Can we omit the double-braces for std::array in C++14? 【发布时间】:2013-09-13 18:17:40 【问题描述】:

我现在正在阅读 C++14 的标准草案,也许我的法律术语有点生疏,但我找不到任何关于允许像下面这样的初始化的内容

std::array<int, 3> arr1,2,3;

合法。 (编辑:显然以上是 C++11 中的合法语法。)目前在 C++11 中,我们必须将 std::array 初始化为

std::array<int, 3> arr1,2,3; // uniform initialization + aggregate initialization

std::array<int, 3> arr = 1,2,3;

我以为我在某处听说他们正在放宽 C++14 中的规则,以便我们在使用统一初始化时不必使用双括号方法,但我找不到实际证据。

注意:我关心这个的原因是因为我目前正在开发一个 multi_array - 类型并且不想像这样初始化它

multi_array<int, 2, 2> matrix = 
   1, 2 ,  3, 4 
;

【问题讨论】:

注意:此讨论仅适用于标量类型的数组;对于聚合数组see here When can outer braces be omitted in an initializer list?的可能重复 【参考方案1】:

其实你也可以用 C++11 编写以下代码:

std::array<int, 3> arr1,2,3;

这是完全有效的语法。

C++11 中不允许的内容类似于this case (请参阅该主题;我不想再在这里写这个,这很长发布)。所以如果你问这个,是的,我们可以省略 C++14 中的额外花括号。这是提案:

Uniform initialization for arrays and class aggregate types

介绍说

本文档建议稍微放宽从聚合初始化中删除大括号的规则,以使数组和类聚合的初始化更加统一。需要进行此更改以支持具有单个成员子聚合的类聚合类型,该子聚合的行为与其对应的数组类似(即std::array)。

希望对您有所帮助。

【讨论】:

非常感谢。期待我什么时候可以使用它,现在:-) cppreference page 表示std::array&lt;int, 3&gt; arr1,2,3; 在 C++11 中无效。 (可能是错的) 您链接的“此案例”主题表示,如 cppreference,std::array &lt;int, 3&gt; arr1,2,3 在 C++11 中是 not 有效语法,因为仅在 C 中放宽了规则++14. 该提案从未被采纳。相反,预先存在的大括号省略规则 were generalized 支持这种情况。

以上是关于我们可以在 C++14 中省略 std::array 的双括号吗?的主要内容,如果未能解决你的问题,请参考以下文章

在截断文本的末尾添加省略号 [重复]

从列表中创建省略号 (...)

c语言中怎么用二维数组作为函数参数

可变参数省略号使用简介

js 中使用var与省略var 定义变量的区别

Perl - 如何从文本文件中省略行?