3

既然我们有了std::array,std::vector和大括号初始化,还需要 C 风格的数组吗?

4

1 回答 1

12

C 风格的数组仍然坚持的一件事std::arraysize 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_lists 具有引用语义,如果它们是从函数返回的,那么您将对某些存储有一个悬空引用。

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

于 2013-06-18T20:53:32.200 回答