【问题标题】:How viable are the alternatives to C-style arrays? [closed]C 样式数组的替代方案有多可行? [关闭]
【发布时间】:2013-06-15 05:40:29
【问题描述】:

现在我们已经有了std::arraystd::vector 和大括号初始化,还需要 C 样式的数组吗?

【问题讨论】:

  • @AndyProwl 您能否更具体一点:可能的用例是什么?
  • @JohnnyW:你认为std::array包含什么?
  • @JesseGood 是的,我知道它们是用来实现std::array的,但这并不意味着非stdlib的开发者应该使用它
  • 这可以讨论到无止境... 一方面,遗留 C 数组对于某些类的实现是必要的。另一方面,它们不应出现在“最终用户”代码中。所以,是的,也不是。

标签: c++ c++11 arrays list-initialization stdarray


【解决方案1】:

C 样式数组仍然保留std::array 的一件事是大小扣除。您可以使用 C 样式数组执行以下操作,but not really with std::array:

int arr[] = {1,2,3,4,5}; // no explicit size

现在,我们还有另一个替代 C 样式数组的候选者:std::initializer_list。在内部,它由某种类似数组的存储支持,但请注意:

#include <initializer_list> // needed

// ...
auto list = {1,2,3,4,5}; // no explicit size, and no explicit type!

还有decltype(list) == std::initializer_list&lt;int&gt;。但是,目前,您无法在编译时查询此类 std::initializer_list 的大小或元素,因为成员函数未标记为 constexpr(但在 C++14 中已修复)。此外,还有一个更大的问题:std::initializer_list 仅提供const 对元素的访问,因此您无法对它们进行变异。
但请注意:std::initializer_lists 具有引用语义,如果它们是从函数返回的,您将获得对某些存储的悬空引用。

最后,我想说,在一些狭窄的情况和利基市场中,C 风格的数组仍有一席之地,但在一般情况下,我们现在有更好的选择,std::arraystd::initializer_list

【讨论】:

  • 谢谢,很好的回答!所以如果我理解正确,什么时候可以在编译时查询initializer_list 的大小,即使这个优势也会消失?我想你可以设计一个模板函数来返回一个 std::array 并减去大小,对吧?
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2012-10-08
  • 2010-10-11
  • 2017-03-23
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多