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
.