既然我们有了std::array
,std::vector
和大括号初始化,还需要 C 风格的数组吗?
问问题
298 次
1 回答
12
C 风格的数组仍然坚持的一件事std::array
是size deduction。您可以使用 C 样式的数组执行以下操作,但不能真正使用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<int>
。但是,目前,您无法std::initializer_list
在编译时查询此类的大小或元素,因为未标记成员函数constexpr
(但在 C++14 中已修复)。此外,还有一个更大的问题:std::initializer_list
只提供const
对元素的 -access,所以你不能改变它们。
但要注意:std::initializer_list
s 具有引用语义,如果它们是从函数返回的,那么您将对某些存储有一个悬空引用。
最后,我想说,在一些狭窄的情况和利基市场中,C 风格的数组仍有一席之地,但在一般情况下,我们现在有更好的选择std::array
和std::initializer_list
。
于 2013-06-18T20:53:32.200 回答