如何对参数包进行迭代 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;
}
很抱歉我的问题含糊不清,但我只是不明白这个函数的作用和作用。来自 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;
}