我正在学习C ++中的参数打包,对此代码段的输出感到困惑:
template<typename... Ts>
void f1(Ts... args)
{
std::cout << "------------------------" << std::endl;
int dummy[sizeof...(Ts)] = { (std::cout << args << std::endl, 0)... };
std::cout << "------------------------" << std::endl;
}
template<typename Tout, typename T>
Tout f2(T arg)
{
std::cout << arg << std::endl;
return 2.0 * (Tout)arg;
}
template<typename... Ts>
void f3(Ts... args)
{
f1(f2<double>(args)...);
}
int main()
{
f1(1, 2, 3);
f3(1, 2, 3);
}
我的机器上的输出如下所示,突出显示了重要的行
------------------------
1
2
3
------------------------
3 <<< GOING BACKWARDS >>>
2
1
------------------------
2
4
6
------------------------
在我看来,f2<double>(args)...
内的f3
的求值是倒数的,但随后又倒过来执行f1
。从到目前为止的阅读中,我认为可以保证参数打包是有序的,所以这非常令人惊讶。
这是一个较大项目的最小示例,在其中重要的是按顺序执行f2
。有什么方法可以使它不颠倒顺序,或者至少可以保证我总是使它向后退?