std::weakly_incrementable
Определён в заголовочном файле <iterator> | ||
|---|---|---|
template< class I >
concept weakly_incrementable =
std::movable<I> &&
requires(I i) {
typename std::iter_difference_t<I>;
requires /*is-signed-integer-like*/<std::iter_difference_t<I>>;
{ ++i } -> std::same_as<I&>; // not required to be equality-preserving
i++; // not required to be equality-preserving
};
| (начиная с C++20) |
Определение /*is-signed-integer-like*/ см. в is-integer-like .
Этот концепт задаёт требования к типам, которые можно инкрементировать с помощью операторов префиксного и постфиксного инкремента, однако эти операции инкремента не обязательно сохраняют равенство, а сам тип не обязан быть std::equality_comparable.
Для типов std::weakly_incrementable a == b не подразумевает ++a == ++b. Алгоритмы для слабо инкрементируемых типов должны быть однопроходными. Эти алгоритмы можно использовать с потоками ввода в качестве источника входных данных через std::istream_iterator.
Семантические требования
Для объекта i типа I I моделирует std::weakly_incrementable только в том случае, если выполнены все следующие условия:
- Выражения
++iиi++имеют одну и ту же область определения. - Если
iинкрементируем, то и++i, иi++продвигаютi. - Если
iинкрементируем, тоstd::addressof(++i) == std::addressof(i).
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| P2325R3 | C++20 |
Требовался default_initializable | не требуется |
См. также
|
(C++20) | задаёт, что операция инкремента для типа weakly_incrementable сохраняет равенство, а сам тип является equality_comparable (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/weakly_incrementable