このSOの質問std::generate
は、標準によって行われた保証についての議論を引き起こしました。特に、内部状態の関数オブジェクトを使用して、呼び出し、結果の格納、再generate(it1, it2, gen)
呼び出し、格納などに依存できますか、それとも、たとえば、後ろから開始できますか?gen()
*it
gen()
*(it + 1)
標準(n3337、§25.3.7/ 1)はこれを述べています:
効果:最初のアルゴリズムは関数オブジェクトを呼び出し
gen
、範囲内のすべてのイテレーターを介してgenの戻り値を割り当てます[first,last)
。[first,first + n)
2番目のアルゴリズムは、関数オブジェクトgenを呼び出し、が正の場合は範囲内のすべてのイテレータを介してgenの戻り値を割り当てn
、それ以外の場合は何もしません。
特に、他の段落の言い回しが強いため、順序が保証されていないようですstd::for_each
(効果:f
範囲内のすべてのイテレータを[first,last)
最初から順に逆参照した結果に適用されますlast - 1
。これを文字通りに解釈する場合は、ただし、開始first
と終了を保証しlast
ます-その間の順序については保証しません)。
ただし、MicrosoftとApacheのC ++標準ライブラリはどちらも、評価を順次行う必要があるドキュメントページに例を示しています。そして、libc ++(in algorithm
)とlibstdc ++(in)の両方bits/stl_algo.h
がそれをそのように実装します。generate
さらに、この保証がないと、多くの潜在的なアプリケーションが失われます。
現在の言い回しは連続性を意味しますか?そうでない場合、これは委員会のメンバーによる見落としでしたか、それとも意図的なものでしたか?
(私は、単に推測したり議論したりせずにこの質問に洞察に満ちた答えを提供できる人は多くないことをよく知っていますが、私の謙虚な意見では、これはこの質問をSOガイドラインに従って「建設的ではない」ものにしません。)
この問題を指摘し、についての段落を参照してくれた@juanchopanzaに感謝しfor_each
ます。