Spec-Zone.ru › C++

std::common_iterator<I,S>::operator*,->

constexpr decltype(auto) operator*();
(1) (начиная с C++20)
constexpr decltype(auto) operator*() const
    requires /*dereferenceable*/<const I>;
(2) (начиная с C++20)
constexpr auto operator->() const
    requires /* see description */;
(3) (начиная с C++20)
Вспомогательные типы
class /*proxy*/ {
    std::iter_value_t<I> keep_;
    constexpr proxy(std::iter_reference_t<I>&& x)
        : keep_(std::move(x)) {}
public:
    constexpr const std::iter_value_t<I>* operator->() const noexcept {
        return std::addressof(keep_);
    }
};
(4) (только для экспозиции*)

Возвращает указатель или ссылку на текущий элемент либо прокси-объект, содержащий его.

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

1,2) Возвращает результат разыменования it.
3) Возвращает указатель или базовый итератор на текущий элемент либо прокси-объект, содержащий его:
  • Эквивалентно return it;, если I является типом указателя или если выражение it.operator->() корректно.
  • В противном случае эквивалентно auto&& tmp = *it; return std::addressof(tmp);, если std::iter_reference_t<I> является типом ссылки.
  • В противном случае эквивалентно return /*proxy*/(*it);.
Выражение в предложении requires эквивалентно std::indirectly_readable<const I> && ( requires(const I& i) { i.operator->(); } || std::is_reference_v<std::iter_reference_t<I>> || std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>> ).

Если std::holds_alternative<I>(var ) равно false, поведение не определено.

(до C++26)

Если std::holds_alternative<I>(var ) равно false:

  • Если реализация усилена проверками, возникает нарушение контракта.
  • Если реализация не усилена проверками, поведение не определено.
(начиная с C++26)

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

1,2) Ссылка на текущий элемент или временный объект prvalue. Эквивалентно *it.
3) Указатель или итератор на текущий элемент либо прокси-объект, содержащий его, как описано выше.

Пример

#include <complex>
#include <initializer_list>
#include <iostream>
#include <iterator>

using std::complex_literals::operator""i;

int main()
{
    const auto il = {1i, 3.14 + 2i, 3i, 4i, 5i};
    
    using CI = std::common_iterator<std::counted_iterator<decltype(il)::iterator>,
                                    std::default_sentinel_t>;
    
    CI ci{std::counted_iterator{std::next(begin(il), 1), std::ssize(il) - 1}};
    
    std::cout << *ci << ' ' << ci->real() << '\n';
}

Вывод:

(3.14,2) 3.14

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

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

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 3574 C++20 variant был полностью constexpr (P2231R1), а common_iterator — нет также сделан constexpr
LWG 3595 C++20 функциям типа прокси не хватало constexpr и noexcept добавлены
LWG 3672 C++20 operator-> в обычных случаях мог возвращать ссылку всегда возвращает по значению

См. также

(конструктор)
создаёт новый common_iterator
(открытая функция-член)

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

Spec-Zone.ru

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