gpt4 book ai didi

C++标准写法: Does "through all iterators in the range" imply sequentiality?

转载 作者:IT老高 更新时间:2023-10-28 12:54:39 28 4
gpt4 key购买 nike

This SO question引发了关于 std::generate 的讨论以及标准做出的保证。特别是,您能否使用具有内部状态的函数对象并依赖 generate(it1, it2, gen)调用gen() , 将结果存储在 *it , 调用gen()再次,存储在 *(it + 1)等等,还是可以从后面开始,例如?

标准(n3337,§25.3.7/1)是这样说的:

Effects: The first algorithm invokes the function object gen and assigns the return value of gen through all the iterators in the range [first,last). The second algorithm invokes the function object gen and assigns the return value of gen through all the iterators in the range [first,first + n) if n is positive, otherwise it does nothing.

似乎无法保证排序,尤其是因为其他段落的措辞更强,例如 std::for_each (效果:将 f 应用于解引用 [first,last) 范围内的每个迭代器的结果,从第一个开始并继续到 last - 1 如果我们从字面上理解,它只能保证从 first 开始,到 last 结束 - 不保证两者之间的顺序)。

但是:两者都是Microsoft'sApache's C++ standard library两者都在他们的文档页面上给出了需要按顺序进行评估的示例。 libc++(在 algorithm 中)和 libstdc++(在 bits/stl_algo.h 中)都以这种方式实现它。此外,您会失去很多 generate 的潜在应用程序。没有这个保证。

当前的措辞是否暗示顺序性?如果不是,这是委员会成员的疏忽还是故意的?

(我很清楚,没有多少人可以在不进行推测或讨论的情况下对这个问题提供有见地的答案,但以我的拙见,这并不会使这个问题按照 SO 指南“没有建设性”。 )


感谢@juanchopanza 指出这个问题并让我引用关于for_each 的段落。 .

最佳答案

LWG475 的讨论中, std::for_eachstd::transform 进行比较。需要注意的是“transform 不保证其函数对象被调用的顺序”。所以,是的,委员会意识到标准中缺乏顺序保证。

对于非顺序行为也没有相反的要求,因此 Microsoft 和 Apache 可以自由使用顺序评估。

关于C++标准写法: Does "through all iterators in the range" imply sequentiality?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823732/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com