我不明白以下C++段代码是做什么的:
template<typename... Ts>
void print(Ts &&... ts)
{
ns::logger{ (print(std::forward<Ts>(ts)), ns::s{})... };
}
我看到有带有可变参数的完美转发,但是下面的行中究竟发生了什么?
我的猜测是,ns::logger
类型的对象正在用一系列值统一初始化,但我不确定哪些值......这是...
折叠表达式吗?
ns::logger
正在使用表达式列表进行初始化(print(std::forward<Ts>(ts)), ns::s{})
,ts
中的每个元素一个。
每个表达式依次使用逗号运算符。它调用print(std::forward<Ts>(ts))
并丢弃其结果(如果有(。然后它构造ns::s{}
,该对象成为逗号运算符的结果。
最终结果大致相当于这个伪代码:
print(std::forward<Ts_1>(ts_1));
print(std::forward<Ts_2>(ts_2));
...
print(std::forward<Ts_N>(ts_N));
ns::logger{ns::s{}, ns::s{}, ... /* repeated N times */};