【问题标题】:Cant initialize a std array into a std vector无法将标准数组初始化为标准向量
【发布时间】:2013-06-03 18:40:53
【问题描述】:

不是真正的问题,而是时尚危机..

 vector<array<unsigned int, 3>> tri;
 tri.push_back(array<unsigned int, 3> {0, 0, 0});

给我一​​个语法错误。有没有什么方法可以在一行中将一个带有值的 std 数组初始化为一个向量?

【问题讨论】:

标签: c++ c++11


【解决方案1】:

std::array 的第一条规则是:当有疑问时,添加更多的大括号。那是因为您实际上是在初始化 std::array 的原始数组子对象。

tri.push_back(array<unsigned int, 3> {{0, 0, 0}});

GCC 和 Clang 都接受这个声明。

【讨论】:

  • @KarliRaudsepp 我不确定这个答案是否正确。我认为这里可以省略额外的大括号。在任何情况下,根据 C++11 标准,是否需要它们并不清楚(这可能已在当前草案中得到修复)。
  • @juanchopanza:当多余的大括号不存在时,Clang 拒绝编译。
  • GCC 也接受没有额外大括号的语句:参见here
  • @Fanael:这并不意味着 GCC 是错误的。大括号省略是 C++11 标准的一部分。
  • @Fanael C++11 标准的措辞对此并不完全清楚。事实上,这很令人困惑。他们给出了一个使用单个普通数组的示例实现,但后来他们说这只是一个示例。不要求 std::array 是包含单个聚合的聚合。但正如我所说,也许这已得到澄清,有利于您的解决方案。但随之而来的是大括号省略的问题。我认为它适用于此。
【解决方案2】:

vs10 仍然不会接受它:/

这就是为什么在您的问题中始终提供完整信息很重要的原因。

Visual Studio 2010 没有实现统一初始化(即统一初始化,而不仅仅是聚合初始化)。它不是符合 C++11 的编译器;它只有一些 C++11 特性。

【讨论】:

  • @CodeClown:实际上,我认为可能是。
  • @CodeClown 这是正确的答案。选择的答案是错误的。我相信在这种情况下可以省略额外的大括号。
  • @John Dibling @ juanchopanza 他只是提到 VS10 不符合 C++11。这应该进入评论。他当然是对的,最初的问题缺乏关键信息,比如使用什么编译器。无论编译器支持什么,正确的答案都应该解释什么语法是正确的。
  • @CodeClown:问题是“为什么这段代码不起作用?”答案是“因为您使用的编译器不接受它。”
  • @Nicol Bolas:嗯,想想你可能是对的。支持你的答案。
猜你喜欢
  • 2015-12-24
  • 2014-12-21
  • 1970-01-01
  • 2014-05-25
  • 2015-08-25
  • 2017-07-03
  • 2014-07-05
相关资源
最近更新 更多