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?换句话说,将f在a列表中的第一个项目,然后第二个项目,第三个项目等上调用,而不是随机跳过扩展列表?我们曾经在每个项目之间调用序列点吗?
是的,括号封闭的初始化列表保证从左到右的评估顺序,而函数调用则不然.所以MyFunc2将正确排序.
维基百科的文章涵盖了这个:https://en.wikipedia.org/wiki/Variadic_templates
我们曾经在每个项目之间调用序列点吗?
不,虽然它使用逗号象征它是不是在逗号操作符.