对std :: for_each实现的限制

gnz*_*lbg 10 c++ foreach c++11

在C++标准(std::for_each)的§25.2.4.2中:

template<class InputIterator, class Function>   Function
for_each(InputIterator first, InputIterator last, Function f);
Run Code Online (Sandbox Code Playgroud)

效果:将f应用于取消引用[first,last]范围内的每个迭代器的结果, 从第一个开始到最后一个 - 1.

  • 这是否意味着f 按顺序应用于容器的元素?
  • 如果是这样,libstdc ++并行模式是否违反了它?
  • 如果没有,为什么§6.5.4中基于范围的for循环没有实现为对std :: for_each的调用?(这将允许基于范围的for循环也由实现自动并行化)

Jon*_*ely 8

  • 这是否意味着按顺序f应用于容器的元素?

我最初说不,但我认为这确实意味着,是的.其他算法不包括该特定措辞.

  • 如果是这样,libstdc ++的并行模式是否违反了它?

也许,并行模式是一个扩展,并且有点实验性,并不是真正声称是标准库的100%一致性实现.(如果它确实声称文档中的某个地方我将修复文档!;-)

  • 如果没有,为什么§6.5.4中基于范围的for循环没有实现为对std :: for_each的调用?(这将允许基于范围的for循环也自动并行化)

基于范围for不依赖于标准库来工作.如果std::begin并且std::end可见,则可以使用它们,但不是必需的.此外,它将涉及将循环体打包为lambda,因此你有一个函数对象要传递给它std::for_each,这会使基于范围的规范变得复杂for,它应该具有相同的语义,并且与手一样高效.书面for循环.但真正的原因可能是没有人想过这样做!

  • 另一个区别是当中止序列时:for_each只能通过抛出异常来实现,而基于范围的for也可以通过break或return语句来实现. (3认同)