可变参数展开之间的排序

Sequencing among a variadic expansion

本文关键字:之间 排序 变参 参数      更新时间:2023-10-16

对于这个非可变参数示例:

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 是一个函数对象,它在第一次调用后会更改其状态。 a的每个部分都会按顺序调用f吗? 换句话说,f是否会在a列表中的第一个项目上调用,然后是第二个项目,第三个项目,等等,而不是随机跳过扩展的列表? 每个项目之间是否有我们过去所说的序列点?

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

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

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

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