Рассмотрим стандартные алгоритмы, такие как, скажем, std::for_each
.
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);
Насколько я могу судить, на относительные состояния двух аргументов InputIterator
не налагается никаких требований.
Значит ли это, что следующее является технически обоснованным? Или это не определено? Что я могу реально ожидать, чтобы do ?
std::vector<int> v{0,1,2,3,4};
std::for_each(
v.begin()+3, // range [3,0)
v.begin(),
[](int){}
);
Джорджи говорит мне:
ошибка: функция требует допустимого диапазона итератора [__first, __last). [+ 13 исключенных строк]
но я не могу сказать, насколько совместима эта отладочная диагностика.
Я задал этот вопрос, пытаясь педантично определить, насколько явно определяется поведение следующего:
std::vector<int> v; // <-- empty
std::for_each( // <-- total no-op? stated or just left to implication?
v.begin(),
v.end(),
[](int){}
);