Standardowe sformułowanie C ++: Czy „przez wszystkie iteratory w zakresie” oznacza kolejność?

To pytanie SO wywołało dyskusję na tematstd::generate oraz gwarancje udzielone przez standard. W szczególności możesz używać obiektów funkcyjnych ze stanem wewnętrznym i polegać na nichgenerate(it1, it2, gen) zadzwonićgen(), zapisz wynik w*it, połączeniegen() znowu, zapisz się*(it + 1) itp., czy może na przykład zacząć od tyłu?

Norma (n3337, §25.3.7 / 1) mówi o tym:

Efekty: Pierwszy algorytm wywołuje obiekt funkcjigen i przypisuje wartość zwracaną przez gen do wszystkich iteratorów w zakresie[first,last). Drugi algorytm wywołuje gen obiektu funkcji i przypisuje wartość powrotu gen do wszystkich iteratorów w zakresie[first,first + n) Jeślin jest pozytywny, inaczej nic nie robi.

Wygląda na to, że żadne zamówienie nie jest zagwarantowane, zwłaszcza że inne akapity mają na przykład mocniejsze brzmieniestd::for_each (Efekty: Dotyczyf do wyniku dereferencji każdego iteratora w zakresie[first,last), zaczynając od pierwszego i przechodząc dolast - 1. Jeśli bierzemy to dosłownie, gwarantuje to tylko rozpoczęciefirst i kończ nalast jednak - nie ma gwarancji na zamawianie pomiędzy).

Ale: ObieMicrosoft iStandardowa biblioteka Apache C ++ oba podają przykłady na swoich stronach z dokumentacją, które wymagają, aby ocena była sekwencyjna. I zarówno libc ++ (walgorithm) i libstdc ++ (wbits/stl_algo.h) realizuj to w ten sposób. Ponadto tracisz wiele potencjalnych aplikacjigenerate bez tej gwarancji.

Czy obecne sformułowanie oznacza sekwencyjność? Jeśli nie, czy było to przeoczenie przez członków komitetu lub celowe?

(Doskonale zdaję sobie sprawę, że nie ma wielu ludzi, którzy potrafią udzielić wnikliwych odpowiedzi na to pytanie, nie spekulując ani dyskutując, ale moim skromnym zdaniem nie czyni to tego pytania „nie konstruktywnym” zgodnie z wytycznymi SO).

Podziękowania dla @juanchopanza za wskazanie tego problemu i skierowanie mnie do akapitufor_each.

questionAnswers(2)

yourAnswerToTheQuestion