我无法理解以下C ++代码的作用:
template<typename... Ts>
void print(Ts &&... ts)
{
ns::logger{ (print(std::forward<Ts>(ts)), ns::s{})... };
}
我看到有可变参数的完美转发,但下面的行正好发生了什么?
我的猜测是ns::logger
类型的对象是用一系列值进行统一初始化但我不确定哪些是...
折叠表达式?
答案 0 :(得分:4)
ns::logger
正在使用(print(std::forward<Ts>(ts)), ns::s{})
的表达式列表进行初始化,ts
中的每个元素都有一个。
每个表达式反过来使用a comma operator。它调用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 */};