В стандарте (n3337, §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 С++ дают примеры на своих страницах документации, которые требуют, чтобы оценка была последовательной. И как libС++ (в algorithm
), так и libstdС++ (в bits/stl_algo.h
) реализуют его таким образом. Кроме того, вы потеряете много потенциальных приложений для generate
без этой гарантии.
Имеет ли нынешняя формулировка последовательность? Если нет, это был надзор со стороны членов комитета или намеренный?
(Я хорошо знаю, что не так много людей, которые могут дать проницательные ответы на этот вопрос, просто не спекулируя или обсуждая, но, по моему скромному мнению, это не делает этот вопрос "не конструктивным" в соответствии с рекомендациями SO. )
Спасибо @juanchopanza за то, что он указал на эту проблему и передал мне параграф о for_each
.