15

我现在正在阅读 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 }}
};
4

1 回答 1

17

实际上,您也可以在 C++11 中编写以下代码:

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

这是完全有效的语法。

但是,C++11中不允许的情况类似于这种情况(请参阅该主题;我不想在这里再次写这个,这是一篇很长的文章)。所以如果你问这个,是的,我们可以省略 C++14 中的额外花括号。这是提案:

  • 数组和类聚合类型的统一初始化

  • 介绍说

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

希望有帮助。

于 2013-09-13T18:21:12.760 回答