【问题标题】:std::array<T> initializationstd::array<T> 初始化
【发布时间】:2012-02-10 09:48:55
【问题描述】:

std::array&lt;T&gt; 本质上是一个包裹在struct 中的 C 样式数组。 structs 的初始化需要大括号,数组的初始化也需要大括号。所以我需要两对大括号:

std::array<int, 5> a = {{1, 2, 3, 4, 5}};

但是我看到的大多数示例代码只使用了一对大括号:

std::array<int, 5> b = {1, 2, 3, 4, 5};

为什么允许这样做,与第一种方法相比,它有什么好处或缺点?

【问题讨论】:

  • 我不确定它是否被标准所允许——可能接受该代码的编译器是基于早期的 C++11 草案,或者只是给出一个警告,因为它是允许格式错误代码的扩展。
  • @ildjarn 根据 Johannes 的说法,这是允许的。

标签: c++ arrays initialization c++11 curly-braces


【解决方案1】:

这样做的好处是您可以……少打字。但缺点是只有在声明具有该形式时才允许您省略大括号。如果你省略了=,或者如果数组是一个成员并且你用member{{1, 2, 3, 4, 5}}初始化它,你不能只传递一对大括号。

这是因为在将大括号传递给函数时,人们担心可能会出现重载歧义,例如 f({{1, 2, 3, 4, 5}})。但这引起了一些讨论,并生成了问题报告。

本质上,= { ... } 初始化总是能够省略大括号,如

int a[][2] = { 1, 2, 3, 4 };

这并不新鲜。新的是你可以省略=,但是你必须指定所有的大括号

int a[][2]{ {1, 2}, {3, 4} };

【讨论】:

  • 你能提供一个标准的报价来证明只有一对牙套是合理的吗?
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2017-04-17
  • 2021-06-26
相关资源
最近更新 更多