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, поскольку тип сентинела может быть несравним с самим собой, и от них не требуется иметь общий тип ссылки.
Использование типа сентинела, отличного от типа итератора, в цикле for с диапазоном разрешено начиная с C++17.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам 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/cpp/iterator/sentinel_for