如何对参数包进行迭代 initializer_list?

How iteration over parameter pack going through initializer_list?

很抱歉我的问题含糊不清,但我只是不明白这个函数的作用和作用。来自 here 的代码:

template<typename ... T>
auto sum (T ... t)
{
    typename std::common_type<T...>::type result{}; //zero-initialization?
    (void)std::initializer_list<int>{(result += t, 0)...}; //why 0 is here
    return result;
}

我不知道为什么这段代码看起来很奇怪,对我来说它看起来不像 C++。从语义上讲,这个函数显然对结果变量中的所有参数求和。但是我完全不明白为什么要这样写。在这里使用 initializer_list 似乎是触发参数包中参数迭代的技巧,但仍然...

为什么 initializer_list 被显式转换为 void?为了不占用额外的内存?

参数包的迭代过程如何?为什么不举个例子 (void)std::initializer_list<int>{(result += t)...};(顺便说一下,它不会编译)。

感谢评论,我找到了答案。

我从来没有遇到过逗号运算符,所以在您对逗号运算符和 this question 的存在发表评论之前,(result += t, 0) 这行对我来说毫无意义。所以基本上我们用零初始化我们的列表。而且由于我为整数创建了 initializer_list 类型,所以我不能写 (void)std::initializer_list<int>{result += t...},因为 result += t 的返回值是 int& 而不是 int.

那我们为什么不写(void)std::initializer_list<int&>{result += t...}呢?它无法编译,我怀疑是因为 array of references is forbidden in C++。所以这是我的问题的解决方案:

template <typename ... T>
auto sum1(T ... t)
{
    std::common_type_t<T...> tmp{};
    std::initializer_list<std::reference_wrapper<std::common_type_t<T...>>>{tmp += t...};
    return tmp;
}