5

对于这个非可变示例:

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

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

没有指定是否先计算Func1()or Func2(),只是两者都必须在MyFunc()调用之前完成。

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

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

假设这f是一个函数对象,它在第一次调用后改变了它的状态。将按f顺序调用? a换句话说,将fa's 列表中的第一项上调用,然后是第二项,第三项等,而不是随机跳过扩展列表?每个项目之间是否有我们过去所说的序列点?

4

1 回答 1

5

是的,大括号括起来的初始值设定项列表保证了从左到右的评估顺序,而函数调用则不然。因此MyFunc2将正确排序。

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

每个项目之间是否有我们过去所说的序列点?

不,虽然它使用逗号标记,但它不是逗号运算符。

于 2012-05-26T08:52:21.470 回答