对于这个非变量示例:
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
?换句话说,将f
在第一个项目上被调用a
的列表,然后是第二项、第三项等,而不是随机跳过扩展列表?每个项目之间是否存在我们以前所说的序列点?
是的,大括号括起来的初始值设定项列表保证从左到右的求值顺序,而函数调用则不能。所以MyFunc2
将正确排序。
维基百科文章对此进行了介绍:https://en.wikipedia.org/wiki/Variadic_templates https://en.wikipedia.org/wiki/Variadic_templates
每个项目之间是否存在我们以前所说的序列点?
不,虽然它使用逗号标记,但它不是the逗号运算符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)