Два сингулярных итератора не образуют допустимый диапазон с _GLIBCXX_DEBUGC++

Программы на C++. Форум разработчиков
Ответить
Гость
 Два сингулярных итератора не образуют допустимый диапазон с _GLIBCXX_DEBUG

Сообщение Гость »


Насколько я понимаю, в соответствии с этим и этим можно сравнивать итераторы, инициализированные значением, даже если они единичны. В единственном случае они действуют так, как если бы они указывали на некоторый виртуальный пустой диапазон.
Однако попытка фактически использовать этот виртуальный пустой диапазон (с ожиданием, что он пуст) в

Код: Выделить всё

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;});

Согласно 24.2.1.7 алгоритмы из std должны получать на вход действительный диапазон. В пункте 6 той же главы указано, что

Итератор j называется достижимым из итератора i тогда и только тогда, когда существует конечная последовательность применений выражения ++i, что делает i == j. Если j достижим из i, они относятся к элементам одной и той же последовательности.

В этом случае интуитивно может быть ноль шагов, хотя я вижу указать, что это либо «нет фактического диапазона», либо «всегда один и тот же диапазон»; Результат suggests the latter option though.
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»