Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于std::数组填充的设计决策 代码:ST::C++中的数组< /COD>是一个有用的类,它提供了C堆栈数组上的C++容器接口。_C++_C++11 - Fatal编程技术网

关于std::数组填充的设计决策 代码:ST::C++中的数组< /COD>是一个有用的类,它提供了C堆栈数组上的C++容器接口。

关于std::数组填充的设计决策 代码:ST::C++中的数组< /COD>是一个有用的类,它提供了C堆栈数组上的C++容器接口。,c++,c++11,C++,C++11,但是为什么std::array没有大多数容器所具有的典型填充构造函数呢?相反,它有一个方法fill 在这方面,std::array在STL容器中是独一无二的,有什么原因吗?有std::array是一个集合(C++11§8.5.1),因此at可以在尽可能多的上下文中使用,其中可以使用普通数组。聚合不能有显式构造函数或析构函数。来自第23.3.2.1节: 数组是可以使用以下语法初始化的聚合(8.5.1) 数组a={初始值设定项列表} 如果它像std::vector那样工作,它就不再是豆荚了。另外,来

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


在这方面,
std::array
在STL容器中是独一无二的,有什么原因吗?

std::array
是一个集合(C++11§8.5.1),因此at可以在尽可能多的上下文中使用,其中可以使用普通数组。聚合不能有显式构造函数或析构函数。

来自第23.3.2.1节:

数组是可以使用以下语法初始化的聚合(8.5.1) 数组a={初始值设定项列表}

如果它像
std::vector
那样工作,它就不再是豆荚了。另外,来自同一节:

应满足骨料(8.5.1)的条件

这些条件是:

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有大括号或等式初始化器 对于非静态数据成员(9.2),没有私有或受保护的非静态数据成员(第11条), 没有基类(第10条),也没有虚函数(第10.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 );
templatestd::数组填充数组(const T&v){
std::数组r;
r、 填充(v);
返回r;
}
自动阵列=填充阵列(7);

因为否则std::array就不再是POD了。我认为C++11放宽了POD@Channel72:POD:“POD结构是一个非联合类,它既是一个普通类,也是一个标准布局类[…]”。普通类:“普通类是一个具有默认构造函数(12.1)、没有非普通默认构造函数且可复制的类。”然而,
std::array
是一个聚合,必须遵循类似的规则(参见Borgleader的回答)。嗯,有什么理由不使用for range循环吗?只是好奇。或者
fill
成员函数?也是@Zeta,只是因为我一直忘记它的存在。更改为使用
fill
,因为它更有意义,而且更有可能进行优化。@Dave:在讨论POD和聚合时,完全忘记了
fill()
,doh。