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*/<I> является true тогда и только тогда, когда I — тип, подобный целому числу со знаком (см. ниже).
Этот концепция определяет требования к типам, которые могут быть инкрементированы с помощью префиксных и постфиксных операторов инкремента, но эти операции инкремента не обязательно являются сохраняющими равенство, и сам тип не требуется, чтобы быть std::equality_comparable.
Для типов std::weakly_incrementable a == b не подразумевает, что ++a == ++b. Алгоритмы для слабо инкрементируемых типов должны быть алгоритмами однократного прохода. Эти алгоритмы могут использоваться с потоками ввода (istream) как источником входных данных через std::istream_iterator.
Семантические требования
I моделирует std::weakly_incrementable только если для объекта i типа I:
- Выражения
++iиi++имеют одинаковую область определения, - Если
iинкрементируем, то оба++iиi++сдвигаютi, и - Если
iинкрементируем, тоstd::addressof(++i) == std::addressof(i).
Типы, подобные целым числам
Тип, подобный целому числу, представляет собой (возможно, с квалификаторами cv) целочисленный тип (за исключением cv bool) или предоставляемый реализацией (а не пользователем) тип, который ведет себя как целочисленный тип, включая все операторы, неявные преобразования и std::numeric_limits специализации. Если тип, подобный целому числу, представляет только неотрицательные значения, он является типом, подобным целому числу без знака, в противном случае — типом, подобным целому числу со знаком.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 3467 | C++20 |
bool считался типом, подобным целому числу | исключён |
| 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/w/cpp/iterator/weakly_incrementable