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

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

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

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

std::array<int, 3> arr{{1,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 }}
};

【问题讨论】:

标签: c++ c++11 c++14


【解决方案1】:

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

std::array<int, 3> arr{1,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; arr{1,2,3}; 在 C++11 中无效。 (可能是错的)
  • 您链接的“此案例”主题表明,如 cppreference,std::array &lt;int, 3&gt; arr{1,2,3} 在 C++11 中是不是有效语法,因为规则仅在 C 中放宽++14.
  • 该提案从未被采纳。相反,预先存在的大括号省略规则 were generalized 支持这种情况。
猜你喜欢
  • 2013-06-03
  • 2019-01-11
  • 1970-01-01
  • 2013-01-31
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多