Spec-Zone.ru › C++

std::common_iterator<I,S>::operator++

constexpr common_iterator& operator++();
(1) (с C++20)
constexpr decltype(auto) operator++( int );
(2) (с C++20)
Типы вспомогательных объектов
class /*postfix_proxy*/ {
    std::iter_value_t<I> keep_;
    constexpr postfix_proxy(std::iter_reference_t<I>&& x)
        : keep_(std::forward<std::iter_reference_t<I>>(x)) {}
public:
    constexpr const std::iter_value_t<I>& operator*() const noexcept {
        return keep_;
    }
};
(3) (только для иллюстрации*)

Увеличивает базовый итератор.

Поведение неопределено, если базовый объект-член std::variant var не содержит объект типа I, т.е. std::holds_alternative<I>(var) равно false.

Пусть it обозначает итератор типа I, хранимый в var, то есть std::get<I>(var).

1) Префиксное увеличение на единицу. Эквивалентно ++it; return *this;.
2) Постфиксное увеличение на единицу:
  • Эквивалентно: auto tmp = *this; ++*this; return tmp;, если I соответствует forward_iterator.
  • Эквивалентно: return it++;, если определение переменной auto&& ref = *it++; корректное, или
  • std::indirectly_readable<I> или
  • std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>> или
  • std::move_constructible<std::iter_value_t<I>>
является false.
  • Эквивалентно: postfix_proxy p(**this); ++*this; return p; в противном случае, где postfix_proxy - вспомогательный тип (только для иллюстрации) (3).

Параметры

(нет)

Возвращаемое значение

1) *this
2) Копия *this, сделанная до изменения, или результат постфиксного увеличения базового итератора, или прокси, сохраняющий значение текущего элемента, как описано выше.

Пример

#include <algorithm>
#include <initializer_list>
#include <iostream>
#include <iterator>
 
int main()
{
    const auto il = {1, 2, 3, 4, 5, 6};
 
    using CI = std::common_iterator<
                   std::counted_iterator<std::initializer_list<int>::iterator>,
                   std::default_sentinel_t
                   >;
 
    CI first{std::counted_iterator{std::begin(il), std::ssize(il) - 2}};
 
    for (; first != std::default_sentinel; ++first)
        std::cout << *first << ' ';
    std::cout << '\n';
}

Вывод:

1 2 3 4

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Правильное поведение
P2259R1 C++20 постфиксное увеличение может отбрасывать результат в большем числе ситуаций используется класс прокси для сохранения результата
LWG 3546 C++20 инициализация объекта прокси иногда была некорректной ситуация и определение скорректированы
LWG 3574 C++20 variant был полностью constexpr (P2231R1), но common_iterator нет также сделан constexpr
LWG 3595 C++20 функции типа прокси не имели constexpr и noexcept добавлены

См. также

operator-
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/common_iterator/operator_arith

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API