std::indirectly_readable_traits
Определено в заголовке <iterator> |
||
|---|---|---|
template< class I >
struct indirectly_readable_traits {};
|
(1) | (с C++20) |
template< class T > struct indirectly_readable_traits<T*>; |
(2) | (с C++20) |
template< class I >
requires std::is_array_v<I>
struct indirectly_readable_traits<I>;
|
(3) | (с C++20) |
template< class T >
struct indirectly_readable_traits<const T> :
indirectly_readable_traits<T> {};
|
(4) | (с C++20) |
template</*has-member-value-type*/ T> struct indirectly_readable_traits<T>; |
(5) | (с C++20) |
template</*has-member-element-type*/ T> struct indirectly_readable_traits<T>; |
(6) | (с C++20) |
template</*has-member-value-type*/ T>
requires /*has-member-element-type*/<T>
struct indirectly_readable_traits<T> {};
|
(7) | (с C++20) |
template</*has-member-value-type*/ T>
requires /*has-member-element-type*/<T> &&
std::same_as<std::remove_cv_t<typename T::element_type>,
std::remove_cv_t<typename T::value_type>>
struct indirectly_readable_traits<T>;
|
(8) | (с C++20) |
Вычисляет связанный тип значения для типа I, если таковой имеется. Пользователи могут специализировать indirectly_readable_traits для определяемого программой типа.
1) Основной шаблон не имеет члена
value_type.
2) Специализация для указателей. Если
T — тип объекта, предоставляет тип-член value_type, равный std::remove_cv_t<T>. В противном случае член value_type отсутствует.
3) Специализация для типов массивов. Предоставляет тип-член
value_type, равный std::remove_cv_t<std::remove_extent_t<I>>.
4) Специализация для типов с квалификатором const.
5) Специализация для типов, которые определяют общедоступный и доступный тип-член
value_type (например, std::reverse_iterator). Если T::value_type — тип объекта, предоставляет тип-член value_type, равный std::remove_cv_t<typename T::value_type>. В противном случае член value_type отсутствует.
6) Специализация для типов, которые определяют общедоступный и доступный тип-член
element_type (например, std::shared_ptr). Если T::element_type — тип объекта, предоставляет тип-член value_type , равный std::remove_cv_t<typename T::element_type>. В противном случае член value_type отсутствует.
7,8) Специализация для типов, которые определяют общедоступные и доступные тип-члены
value_type и element_type (например, std::span). Если оба T::value_type и T::element_type являются типами объектов, и они становятся одинаковыми типом после удаления cv-квалификаторов в верхнем уровне, предоставляет тип-член value_type, равный std::remove_cv_t<typename T::value_type>. В противном случае член value_type отсутствует.Примечания
value_type предназначен для использования с indirectly_readable типами, такими как итераторы. Он не предназначен для использования с диапазонами.
Пример
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 3446 | C++20 | специализации были неоднозначными для типов, содержащих оба value_type и element_type тип-члена |
добавленная специализация для устранения неоднозначности |
| LWG 3541 | C++20 | LWG 3446 ввёл жёсткую ошибку для неоднозначных случаев, когдаvalue_type и element_type разные |
сделано, чтобы результирующая подстановка завершилась неудачей |
См. также
|
(C++20) |
определяет, что тип является косвенно читаемым путём применения оператора * (концепция) |
|
(C++20)(C++20)(C++23)(C++20)(C++20)(C++20) |
вычисляет связанные типы итератора (шаблон псевдонима) |
| предоставляет унифицированный интерфейс к свойствам итератора (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/indirectly_readable_traits