std::array
在 C++11 中是一个有用的类,它通过 C 堆栈数组提供 C++ 容器接口。
但是为什么没有std::array
大多数容器所具有的典型填充构造函数呢?相反,它有一个方法fill
。
std::array
在这方面,STL 容器有什么独特之处吗?
从第 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)。
是的; std::array
意味着是一个聚合(C++11 §8.5.1),以便 at 可以在尽可能多的上下文中使用纯数组。聚合不能有显式构造函数或析构函数。
我认为每个人都很好地解释了“为什么”,所以我将提出一个解决方法建议,它应该编译为与本机构造函数一样好:
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 );