可变参数展开之间的排序
Sequencing among a variadic expansion
对于这个非可变参数示例:
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
每个项目之间是否有我们过去所说的序列点?
不,虽然它使用逗号标记,但它不是逗号运算符。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 二叉排序树无法编译
- int(c) 和 c-'0' 之间的区别。C++
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 在cuda线程之间共享大量常量数据
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 在c代码之间共享数据的最佳方式
- 如何在 1 到 50000 之间对 10000 个数字进行排序
- 合并排序问题,在方法之间传递数组
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- 可变参数展开之间的排序
- 有符号零和无符号零 c++ 之间的排序
- 根据点之间的距离对点进行排序
- 测量在算法库中对100万个0到1之间的浮点数进行排序的时间
- 对两个字符数组之间的重复项进行排序
- 列表排序和结构体向量排序之间的性能差距.c++
- c++插入排序:在函数之间传递值时出错
- 没有自然排序顺序的两个std::向量之间的差