Spec-Zone.ru › C++

std::iter_value_t, std::iter_reference_t, std::iter_const_reference_t, std::iter_difference_t, std::iter_rvalue_reference_t, std::iter_common_reference_t

Определён в заголовочном файле <iterator>
template< class T >
using iter_value_t = /* see below */;
(1) (начиная с C++20)
template< /*dereferenceable*/ T >
using iter_reference_t = decltype(*std::declval<T&>());
(2) (начиная с C++20)
template< std::indirectly_readable T >
using iter_const_reference_t =
    std::common_reference_t<const std::iter_value_t<T>&&,
                            std::iter_reference_t<T>>;
(3) (начиная с C++23)
template< class T >
using iter_difference_t = /* see below */;
(4) (начиная с C++20)
template< /*dereferenceable*/ T>
    requires /* see below */
using iter_rvalue_reference_t =
    decltype(ranges::iter_move(std::declval<T&>()));
(5) (начиная с C++20)
template< std::indirectly_readable T >
using iter_common_reference_t =
    std::common_reference_t<std::iter_reference_t<T>,
                            /*indirect-value-t*/<T>>;
(6) (начиная с C++20)
Вспомогательные шаблоны
template< class T >
concept /*dereferenceable*/ = /* see below */;
(7) (только для описания*)
template< std::indirectly_readable T >
using /*indirect-value-t*/ = /* see below */;
(8) (только для описания*)

Вычисляет связанные с итератором типы.

1) Вычисляет тип значения T.
  • Если std::iterator_traits<std::remove_cvref_t<T>> не специализирован, то std::iter_value_t<T> — это std::indirectly_readable_traits<std::remove_cvref_t<T>>::value_type.
  • В противном случае это std::iterator_traits<std::remove_cvref_t<T>>::value_type.
2) Вычисляет тип ссылки T.
3) Вычисляет тип константной ссылки T.
4) Вычисляет тип разности T.
  • Если std::iterator_traits<std::remove_cvref_t<T>> не специализирован, то std::iter_difference_t<T> — это std::incrementable_traits<std::remove_cvref_t<T>>::difference_type.
  • В противном случае это std::iterator_traits<std::remove_cvref_t<T>>::difference_type.
5) Вычисляет тип rvalue-ссылки T. Ограничение этого шаблона псевдонима выполнено тогда и только тогда, когда выражение ranges::iter_move(std::declval<T&>()) корректно, а его тип не является (возможно, cv-квалифицированным) void.
6) Вычисляет тип общей ссылки T. Это тип общей ссылки между его типом ссылки и lvalue-ссылкой на его тип значения.
7) Понятие, используемое только для описания, dereferenceable выполнено тогда и только тогда, когда выражение *std::declval<T&>() корректно, а его тип не является (возможно, cv-квалифицированным) void.
8) Шаблон псевдонима, используемый только для описания, indirect-value-t обозначает следующее:
  • std::invoke_result_t<Proj&,/*indirect-value-t*/<I>>, если T совпадает с std::projected<I,Proj> для некоторых типов I и Proj.
  • В противном случае std::iter_value_t<T>&.

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

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

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
P2609R3 C++20 std::iter_common_reference_t определялся через
std::iter_value_t<T>&, что приводило к некорректной обработке
типов std::projected, проецируемых в типы rvalue-ссылок
определяется через
/*indirect-value-t*/<T>
для обработки таких случаев

См. также

indirectly_readable
(C++20)
задаёт тип, который допускает косвенное чтение с помощью оператора *
(понятие)
weakly_incrementable
(C++20)
задаёт тип semiregular, который можно инкрементировать с помощью операторов префиксного и постфиксного инкремента
(понятие)
indirectly_readable_traits
(C++20)
вычисляет тип значения типа indirectly_readable
(шаблон класса)
incrementable_traits
(C++20)
вычисляет тип разности типа weakly_incrementable
(шаблон класса)
iterator_traits
предоставляет единообразный интерфейс к свойствам итератора
(шаблон класса)
ranges::iterator_tranges::const_iterator_tranges::sentinel_tranges::const_sentinel_t
(C++20)(C++23)(C++20)(C++23)
получает типы итератора и сентинела диапазона
(шаблон псевдонима)
ranges::range_reference_tranges::range_const_reference_tranges::range_rvalue_reference_tranges::range_common_reference_t
(C++20)(C++23)(C++20)(C++20)
получает типы ссылок диапазона
(шаблон псевдонима)
ranges::range_difference_tranges::range_size_tranges::range_value_t
(C++20)(C++20)(C++20)
получает типы размера, разности и значения диапазона
(шаблон псевдонима)

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

Spec-Zone.ru

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