Namespaces
Variants

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

From ru.cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
constexpr decltype ( auto ) operator * ( ) ;
(1) (начиная с C++20)
constexpr decltype ( auto ) operator * ( ) const
requires /*dereferenceable*/ < const I > ;
(2) (начиная с C++20)
constexpr auto operator - > ( ) const
requires /* см. описание */ ;
(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) ( только для демонстрации* )

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

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

Пусть 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 ) ; , где proxy является классом только для экспозиции (4) .
Выражение в requires -клаузе эквивалентно
std:: indirectly_readable < const I > && (

требует ( 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 >>

)
.

Содержание

Параметры

(нет)

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

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

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

Смотрите также

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