Насколько я понимаю, в соответствии с этим и этим можно сравнивать итераторы, инициализированные значением, даже если они единичны. В единственном случае они действуют так, как если бы они указывали на некоторый виртуальный пустой диапазон.
Однако попытка фактически использовать этот виртуальный пустой диапазон (с ожиданием, что он пуст) в
Код: Выделить всё
std::find_ifКод: Выделить всё
/opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algo.h:3875:
In function:
_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter =
gnu_debug::_Safe_iterator; _Predicate =
main()::]
Error: function requires a valid iterator range [first, last).
Код: Выделить всё
std::multimap::iterator it1{};
std::multimap::iterator it2{};
(void) (it1==it2); // OK
std::find_if(it1, it2, [](const auto& el) { return el.second == 8;});
Итератор j называется достижимым из итератора i тогда и только тогда, когда существует конечная последовательность применений выражения ++i, что делает i == j. Если j достижим из i, они относятся к элементам одной и той же последовательности.
В этом случае интуитивно может быть ноль шагов, хотя я вижу указать, что это либо «нет фактического диапазона», либо «всегда один и тот же диапазон»; Результат
Код: Выделить всё
==It makes me wonder: what is the rationale behind such decision and what would relaxing it cause, possibly break?
DEMO: https://godbolt.org/z/oPnnaY8jq
Источник: https://stackoverflow.com/questions/781 ... bcxx-debug
Мобильная версия