不能理解完美转发和椭圆一块的C++代码

问题描述:

我不明白什么是下面这段C++代码的功能:不能理解完美转发和椭圆一块的C++代码

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

我看到有一个与可变参数的完美转发,但下面的行中究竟发生了什么?

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

+0

谢谢,并将'纳秒::Š{}'在每个'print'返回的对象之后加入? – Dean

+0

'print'的返回类型是什么? – Holt

+0

@Holt'void',我认为它返回了不同的东西..对不起 – Dean

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 */}; 
+0

...并且如果'logger'和's'是微不足道的类型,这是获得语句包扩展效果的常用解决方法。令人困惑的位无所作为;它只是一个小小的舞蹈,为'print()...'提供了一个合适的环境,这是一个有趣的部分。 – Potatoswatter