无法理解一段具有完美转发和省略号的C++代码



我不明白以下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 */};

最新更新