对于这个非变量的例子:
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
,而不是随机跳过展开的列表?我们曾经在每个项目之间调用序列点吗?
答案 0 :(得分:5)
是的,括号封闭的初始化列表保证从左到右的评估顺序,而函数调用则不然。因此MyFunc2
将正确排序。
维基百科的文章涵盖了这一点:https://en.wikipedia.org/wiki/Variadic_templates
我们曾经在每个项目之间调用序列点吗?
不,虽然它使用逗号令牌,但它不是 逗号运算符。