11

std::array在 C++11 中是一个有用的类,它通过 C 堆栈数组提供 C++ 容器接口。

但是为什么没有std::array大多数容器所具有的典型填充构造函数呢?相反,它有一个方法fill

std::array在这方面,STL 容器有什么独特之处吗?

4

3 回答 3

6

从第 23.3.2.1 节开始:

数组是可以使用语法数组 a = { initializer-list } 初始化的聚合 (8.5.1);

如果它像std::vector它一样工作,它就不再是 POD 了。另外来自同一部分:

应满足骨料 (8.5.1) 的条件。

这些条件是:

聚合是一个数组或一个类(第 9 条),没有用户提供的构造函数(12.1),没有用于非静态数据成员的大括号或等式初始化器(9.2),没有私有或受保护的非静态数据成员(第 11 条) ),没有基类(第 10 条),也没有虚函数(10.3)。

于 2013-08-09T20:45:29.147 回答
5

是的; std::array意味着是一个聚合(C++11 §8.5.1),以便 at 可以在尽可能多的上下文中使用纯数组。聚合不能有显式构造函数或析构函数。

于 2013-08-09T20:44:26.530 回答
3

我认为每个人都很好地解释了“为什么”,所以我将提出一个解决方法建议,它应该编译为与本机构造函数一样好:

template< typename T, std::size_t n > std::array<T,n> filledArray( const T& v ) {
    std::array<T,n> r;
    r.fill( v );
    return r;
}

auto arr = filledArray<int,4>( 7 );
于 2013-08-09T20:51:23.460 回答