std::sized_sentinel_for, std::disable_sized_sentinel_for
Определено в заголовке <iterator> | ||
|---|---|---|
template< class S, class I >
concept sized_sentinel_for =
std::sentinel_for<S, I> &&
!std::disable_sized_sentinel_for<std::remove_cv_t<S>, std::remove_cv_t<I>> &&
requires(const I& i, const S& s) {
{ s - i } -> std::same_as<std::iter_difference_t<I>>;
{ i - s } -> std::same_as<std::iter_difference_t<I>>;
};
| (1) | (с C++20) |
template< class S, class I >
inline constexpr bool disable_sized_sentinel_for = false;
| (2) | (с C++20) |
1) Концепция
sized_sentinel_for определяет, что объект типа итератора I и объект типа конечной точки S могут быть вычитаны для вычисления расстояния между ними за постоянное время.
2) Шаблонная переменная
Шаблонная переменная может быть специализирована для неквалифицированных по cv и не являющихся массивом типов объектов
disable_sized_sentinel_for может использоваться для предотвращения того, чтобы итераторы и конечные точки, которые могут быть вычитаны, но фактически не моделируют sized_sentinel_for, удовлетворяли концепции.Шаблонная переменная может быть специализирована для неквалифицированных по cv и не являющихся массивом типов объектов
S и I, по крайней мере, один из которых является определённым в программе типом. Такие специализации должны быть применимы в константных выражениях и иметь тип const bool.Семантические требования
Пусть i — итератор типа I, а s — конечная точка типа S такая, что [i, s) обозначает диапазон. Пусть n — наименьшее количество применений ++i необходимое для того, чтобы bool(i == s) стало true. I и S моделируют sized_sentinel_for<S, I> только в том случае, если:
- Если
nпредставимоstd::iter_difference_t<I>, тоs - iопределено и равноn; и - Если
-nпредставимоstd::iter_difference_t<I>, тоi - sопределено и равно-n. - Вычитание между
iиsимеет сложность выполнения за постоянное время.
Сохранение равенства
Выражения, объявленные в выражениях `requires` стандартных концепций, должны быть сохраняющими равенство (за исключением случаев, когда указано иное).
Неявные вариации выражений
Выражение `requires`, использующее выражение, которое не изменяет некоторые константные ссылки на переменные, также требует неявных вариаций выражений.
См. также
|
(C++20) | определяет, что диапазон знает свой размер за постоянное время (концепция) |
|
(C++20) | возвращает целое число, равное размеру диапазона (объект точки кастомизации) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/sized_sentinel_for