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++.

Отчёт об ошибке Применён к Поведение согласно опубликованной версии Корректное поведение
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/cpp/iterator/common_iterator/operator_arith

Spec-Zone.ru

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