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) Вычисляет тип константной ссылки
4) Вычисляет тип разности T.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) Понятие, используемое только для описания,
8) Шаблон псевдонима, используемый только для описания, dereferenceable выполнено тогда и только тогда, когда выражение *std::declval<T&>() корректно, а его тип не является (возможно, cv-квалифицированным) void.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> для обработки таких случаев |
См. также
|
(C++20) | задаёт тип, который допускает косвенное чтение с помощью оператора * (понятие) |
|
(C++20) | задаёт тип semiregular, который можно инкрементировать с помощью операторов префиксного и постфиксного инкремента (понятие) |
|
(C++20) | вычисляет тип значения типа indirectly_readable (шаблон класса) |
|
(C++20) | вычисляет тип разности типа weakly_incrementable (шаблон класса) |
| предоставляет единообразный интерфейс к свойствам итератора (шаблон класса) |
|
|
(C++20)(C++23)(C++20)(C++23) | получает типы итератора и сентинела диапазона (шаблон псевдонима) |
|
(C++20)(C++23)(C++20)(C++20) | получает типы ссылок диапазона (шаблон псевдонима) |
|
(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