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

时间:2017-08-27 18:09:57

标签: c++

我无法理解以下C ++代码的作用:

template<typename... Ts>
void print(Ts &&... ts)
{
    ns::logger{ (print(std::forward<Ts>(ts)), ns::s{})... };
}

我看到有可变参数的完美转发,但下面的行正好发生了什么?

我的猜测是ns::logger类型的对象是用一系列值进行统一初始化但我不确定哪些是...折叠表达式?

1 个答案:

答案 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 */};