Spec-Zone.ru › C++

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 разные
сделано, чтобы результирующая подстановка завершилась неудачей

См. также

indirectly_readable
(C++20)
определяет, что тип является косвенно читаемым путём применения оператора *
(концепция)
iter_value_titer_reference_titer_const_reference_titer_difference_titer_rvalue_reference_titer_common_reference_t
(C++20)(C++20)(C++23)(C++20)(C++20)(C++20)
вычисляет связанные типы итератора
(шаблон псевдонима)
iterator_traits
предоставляет унифицированный интерфейс к свойствам итератора
(шаблон класса)

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

Spec-Zone.ru

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