Стандартная формулировка C ++: подразумевает ли «сквозь все итераторы в диапазоне» последовательность?

Это ТАК вопрос вызвал дискуссию оstd::generate и гарантии, сделанные стандартом. В частности, можете ли вы использовать функциональные объекты с внутренним состоянием и полагаться наgenerate(it1, it2, gen) звонитьgen()сохранить результат в*it, вызовgen() снова хранить в*(it + 1) и т.д., или это может начаться сзади, например?

Стандарт (п. 3337, §25.3.7 / 1) говорит это:

Эффекты: первый алгоритм вызывает объект функцииgen и присваивает возвращаемое значение gen через все итераторы в диапазоне[first,last), Второй алгоритм вызывает функциональный объект gen и назначает возвращаемое значение gen через все итераторы в диапазоне[first,first + n) еслиn положительно, иначе ничего не делает.

Похоже, что порядок не гарантируется, тем более что другие абзацы имеют более сильную формулировку, например (std::for_eachЭффекты: применяетсяf к результату разыменования каждого итератора в диапазоне[first,last), начиная с первого и продолжая до.last - 1 Если мы'принимая это буквально, это только гарантирует, что начать сfirst и заканчивается вlast хотя - никаких гарантий при заказе между ними).

Но: И то и другоеот Microsoft а такжеApache»стандартная библиотека C ++ оба приводят примеры на своих страницах документации, которые требуют, чтобы оценка была последовательной. И оба libc ++ (вalgorithm) и libstdc ++ (вbits/stl_algo.h) реализовать это таким образом. Кроме того, вы потеряете много потенциальных приложений дляgenerate без этой гарантии.

Означает ли нынешняя формулировка последовательность? Если нет, было ли это упущением со стороны членов комитета или намеренным?

(Я хорошо знаю, что нет«Многие люди, которые могут дать проницательные ответы на этот вопрос, не просто размышляя или обсуждая, но, по моему скромному мнению, это не делает этот вопрос».не конструктивно согласно рекомендациям SO.)

Спасибо @juanchopanza за указание на эту проблему и за ссылку на этот пункт.for_each

Ответы на вопрос(2)

Ваш ответ на вопрос