我们可以在 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<int, 3> arr1,2,3;
在 C++11 中无效。 (可能是错的)
您链接的“此案例”主题表示,如 cppreference,std::array <int, 3> arr1,2,3
在 C++11 中是 not 有效语法,因为仅在 C 中放宽了规则++14.
该提案从未被采纳。相反,预先存在的大括号省略规则 were generalized 支持这种情况。以上是关于我们可以在 C++14 中省略 std::array 的双括号吗?的主要内容,如果未能解决你的问题,请参考以下文章