C++ 使用std::index_序列进行std::数组初始化的包扩展

C++ 使用std::index_序列进行std::数组初始化的包扩展,c++,templates,index-sequence,C++,Templates,Index Sequence,我需要初始化一个std:array,其中N个对象采用相同的构造函数参数,如std::vector(size\t,{args…})中所示。通过我在这里的搜索,我得出了一个有效的结论: template<typename T, size_t... Ints, typename... Args> std::array<T, sizeof...(Ints)> make_array_(std::index_sequence<Ints...>, Args&&

我需要初始化一个std:array,其中N个对象采用相同的构造函数参数,如
std::vector(size\t,{args…})
中所示。通过我在这里的搜索,我得出了一个有效的结论:

template<typename T, size_t... Ints, typename... Args>
std::array<T, sizeof...(Ints)> make_array_(std::index_sequence<Ints...>, Args&&... args) {
    return { (Ints, T{args...})... };
}

template<typename T, size_t N, typename... Args>
std::array<T, N> make_array(Args&&... args) {
    return make_array_<T>(std::make_index_sequence<N>(), args...);
}

struct AStruct {
    AStruct(int a, float b) : a_{ a }, b_{ b } {}
private:
    int a_; float b_;
}

int main() {
    auto anArray = make_array<AStruct, 10>(8, 5.4f);
    // etc...
}
模板
std::数组生成\数组(std::索引\序列,Args&…Args){
返回{(Ints,T{args…})…};
}
模板
std::数组生成_数组(Args&&…Args){
返回make_数组(std::make_index_sequence(),args…);
}
结构构造{
AStruct(inta,float b):a{a},b{b}
私人:
int a_uu;;float b_uuuu;;
}
int main(){
自动阵列=制作阵列(8,5.4f);
//等等。。。
}

但我不明白第三行。
(Ints,T{args…})
如何转换为
T{args…},T{args…},T{args…}…
N次?

外部参数包没有以您编写的方式展开,它是这样展开的(内部包没有显示展开,因为您似乎没有遇到问题):

其中整数的类型为
std::size\u t

(0,T{args…})
是括号内初始值设定项的一个元素。它是一个使用逗号运算符的表达式。逗号运算符首先计算左侧(
0
),然后计算右侧(
T{args…}
),返回后者

由于
0
的求值没有副作用,并且其值被逗号运算符丢弃,因此这实际上相当于

return { T{args...}, T{args...}, T{args...} };
对此有一个警告。逗号运算符可以重载。如果有一个重载接受
std::size_t
作为第一个参数和
t
作为第二个参数,那么这将以一种意外的方式运行,用重载的结果初始化返回值。这可以通过将整数强制转换为
void
(它永远不能作为重载运算符调用的参数出现)来防止:


逗号运算符。。。我总是忘记这件事。谢谢
return { T{args...}, T{args...}, T{args...} };
return { (void(Ints), T{args...})... };