这个 SO 问题引发了关于标准的讨论std::generate
和保证。特别是,您可以使用具有内部状态的函数对象并依赖于generate(it1, it2, gen)
调用gen()
、存储结果、再次*it
调用、存储等,还是可以从后面开始,例如?gen()
*(it + 1)
标准(n3337,§25.3.7/1)这样说:
效果:第一个算法调用函数对象
gen
并通过 range 中的所有迭代器分配 gen 的返回值[first,last)
。第二种算法调用函数对象 gen 并通过范围内的所有迭代器分配 gen 的返回值,[first,first + n)
如果n
为正,则它不执行任何操作。
似乎没有顺序可以保证,特别是因为其他段落有更强的措辞,例如std::for_each
(效果:适用f
于取消引用范围内每个迭代器的结果[first,last)
,从 first 开始并继续到last - 1
。如果我们从字面上理解,它只是虽然保证开始first
和结束last
- 不保证两者之间的顺序)。
但是:Microsoft和Apache 的 C++ 标准库都在其文档页面上提供了要求按顺序进行评估的示例。libc++ (in algorithm
) 和 libstdc++ (in bits/stl_algo.h
) 都以这种方式实现它。generate
此外,如果没有此保证,您将失去很多潜在的应用程序。
当前的措辞是否暗示顺序性?如果不是,这是委员会成员的疏忽还是故意的?
(我很清楚,没有多少人可以在不只是推测或讨论的情况下对这个问题提供有见地的答案,但以我的拙见,根据 SO 指南,这并不会使这个问题“不具建设性”。)
感谢@juanchopanza 指出这个问题并让我参考关于for_each
.