在可变扩展中的排序

时间:2012-05-26 08:46:35

标签: c++ c++11 variadic-templates variadic-functions sequence-points

对于这个非变量的例子:

int     Func1();
double  Func2();
void    MyFunc( int, double );

int  main()
{
    MyFunc( Func1(), Func2() );
    //...
}

未指定是先计算Func1()还是Func2(),只是必须在调用MyFunc()之前完成两者。

这种测序如何与可变参数的扩展一起工作?

template < typename Func, typename ...Args >
void  MyFunc2( Func &&f, Args&& ...a )
{
    int  b[] = { f( std::forward<Args>(a) )... };
    //...
}

假设f是一个在第一次调用后改变其状态的函数对象。 f的每个段都会调用a吗?换句话说,f列表中的第一项,第二项,第三项等是否会调用a,而不是随机跳过展开的列表?我们曾经在每个项目之间调用序列点吗?

1 个答案:

答案 0 :(得分:5)

是的,括号封闭的初始化列表保证从左到右的评估顺序,而函数调用则不然。因此MyFunc2将正确排序。

维基百科的文章涵盖了这一点:https://en.wikipedia.org/wiki/Variadic_templates

  

我们曾经在每个项目之间调用序列点吗?

不,虽然它使用逗号令牌,但它不是 逗号运算符。