不能理解完美转发和椭圆一块的C++代码
问题描述:
我不明白什么是下面这段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
。
每个表达式反过来使用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
谢谢,并将'纳秒::Š{}'在每个'print'返回的对象之后加入? – Dean
'print'的返回类型是什么? – Holt
@Holt'void',我认为它返回了不同的东西..对不起 – Dean