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) Шаблон переменной
disable_sized_sentinel_for можно использовать, чтобы предотвратить удовлетворение концепту итераторами и сентинелами, которые можно вычесть друг из друга, но которые на самом деле не моделируют sized_sentinel_for.
Программа может специализировать
disable_sized_sentinel_for для неконстантного и невольатильного типа объекта без массива S и I при условии, что хотя бы один из них является типом, определённым программой. Такие специализации можно использовать в константных выражениях; они имеют тип constbool.Семантические требования
Пусть 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.
Сохранение равенства
Требуется, чтобы выражения, объявленные в requires-выражениях концептов стандартной библиотеки, сохраняли равенство (кроме случаев, когда указано иное).
Неявные варианты выражений
requires-выражение, использующее выражение, которое не изменяет некоторый операнд — константное lvalue, также требует наличия неявных вариантов выражений.
См. также
|
(C++20) | задаёт диапазон, размер которого известен за постоянное время (концепт) |
|
(C++20) | возвращает целое число, равное размеру диапазона (объект-точка настройки) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/sized_sentinel_for