在可变扩展中的排序

CTM*_*ser 5 c++ variadic-functions sequence-points variadic-templates c++11

对于这个非变量的例子:

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

int  main()
{
    MyFunc( Func1(), Func2() );
    //...
}
Run Code Online (Sandbox Code Playgroud)

它没有规定是否Func1()还是Func2()先计算,只是两者都必须做之前MyFunc()被调用.

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

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

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

Pub*_*bby 5

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

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

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

不,虽然它使用逗号象征它是不是逗号操作符.