关于std :: array fill的设计决策

时间:2013-08-09 20:37:09

标签: c++ c++11

C ++ 11中的

std::array是一个有用的类,它在C堆栈数组上提供C ++ Container接口。

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

在这方面,为什么std::array在STL容器中是唯一的?

3 个答案:

答案 0 :(得分:6)

从第23.3.2.1节:

  

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

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

  

应满足总量(8.5.1)的条件。

这些条件是:

  

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

答案 1 :(得分:5)

是; std::array意味着是一个聚合(C ++11§8.5.1),因此可以在可以使用普通数组的情况下使用尽可能多的上下文。聚合可以没有显式构造函数或析构函数。

答案 2 :(得分: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 );