Рассмотрим стандартные алгоритмы, например, std::for_each
.
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);
Насколько я могу судить, на относительные состояния двух аргументов InputIterator
не существует требования.
Означает ли это, что следующее технически обосновано? Или это undefined? Что я могу реально ожидать от этого?
std::vector<int> v{0,1,2,3,4};
std::for_each(
v.begin()+3, // range [3,0)
v.begin(),
[](int){}
);
geordi говорит мне:
error: функция требует допустимого диапазона итератора [__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){}
);