std::sentinel_for
Определено в заголовке <iterator> | ||
|---|---|---|
template< class S, class I >
concept sentinel_for =
std::semiregular<S> &&
std::input_or_output_iterator<I> &&
__WeaklyEqualityComparableWith<S, I>;
| (с C++20) |
Концепция sentinel_for определяет отношение между типом input_or_output_iterator и типом semiregular, значения которого обозначают диапазон. Концепция __WeaklyEqualityComparableWith (только для экспозиции) описана в equality_comparable.
Семантические требования
Пусть s и i — значения типа S и I, соответственно, такие, что [i, s) обозначает диапазон. sentinel_for<S, I> моделируется только в том случае, если:
-
i == sопределено корректно. - Если
bool(i != s)тоiразрешается для обращений к элементу и[++i,s)обозначает диапазон. -
std::assignable_from<I&, S>либо моделируется, либо не удовлетворяет требованиям.
Область действия == может меняться со временем. Учитывая итератор i и стоп-значение s такие, что [i, s) обозначает диапазон и i != s, [i, s) не обязательно будет продолжать обозначать диапазон после инкрементирования любого итератора, равного i (и, следовательно, i == s больше не обязательно должно быть корректно определено после такого инкрементирования).
Примечания
Тип стоп-значения и соответствующий ему тип итератора не обязаны моделировать equality_comparable_with, так как тип стоп-значения может не быть сравнимым с самим собой, и они не обязаны иметь общий тип ссылки.
С C++17 разрешается использовать тип стоп-значения, отличный от типа итератора, в цикле с диапазоном for.
Отчеты о дефектах
Следующие отчеты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 3453 | C++20 | семантические требования для sentinel_for были слишком слабыми для ranges::advance | усилены |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/sentinel_for