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*> :
    /* cond-value-type */<T> {};
(2) (начиная с C++20)
template< class I >
    requires std::is_array_v<I>
struct indirectly_readable_traits<I>;
{ using value_type = std::remove_cv_t<std::remove_extent_t<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> :
    /* cond-value-type */<typename T::value_type> {};
(5) (начиная с C++20)
template< /* has-member-element-type */ T >
struct indirectly_readable_traits<T> :
    /* cond-value-type */<typename T::element_type> {};
(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> :
    /* cond-value-type */<typename T::value_type> {};
(8) (начиная с C++20)
Вспомогательные классы и концепции
template< class >
struct /* cond-value-type */ {};
(1) (только для пояснения*)
template< class T >
    requires std::is_object_v<T>
struct /* cond-value-type */ <T>
{ using value_type = std::remove_cv_t<T>; };
(2) (только для пояснения*)
template< class T >
concept /* has-member-value-type */ =
    requires { typename T::value_type; };
(3) (только для пояснения*)
template< class T >
concept /* has-member-element-type */ =
    requires { typename T::element_type; };
(4) (только для пояснения*)

Вычисляет связанный тип значения аргумента шаблона. Если связанный тип значения существует, он представлен вложенным типом value_type, в противном случае value_type не определён. Программа может специализировать indirectly_readable_traits для типа, определённого программой.

Пояснение

Приведённые выше специализации можно неформально описать следующим образом.

Для типа T его связанный тип значения V определяется следующим образом:

  • Если T имеет квалификатор const, V является связанным типом значения для T без квалификаторов const.
  • В противном случае, если T является типом массива, V является типом элемента массива без cv-квалификаторов.
  • В противном случае сначала определяется условный тип значения C:
  • Если T является типом указателя, C является типом, на который он указывает.
  • В противном случае, если T имеет вложенные типы value_type и element_type:
    • Если эти типы совпадают (без учёта cv-квалификации), C является typename T::value_type.
    • В противном случае C не определён.
  • В противном случае, если T имеет вложенный тип value_type, но не имеет element_type, C является typename T::value_type.
  • В противном случае, если T имеет вложенный тип element_type, но не имеет value_type, C является typename T::element_type.
  • В противном случае C не определён.
Затем V определяется на основе C следующим образом:
  • Если C не определён или C не является объектным типом, V не определён.
  • В противном случае V является C без cv-квалификаторов.

Примечания

value_type предназначен для использования с типами indirectly_readable, например с итераторами. Он не предназначен для использования с диапазонами.

Пример

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

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

Отчёт об ошибке Применён к Поведение в опубликованной версии Исправленное поведение
LWG 3446 C++20 специализации (5,6) были неоднозначны для типов, имеющих
оба вложенных типа value_type и element_type
добавлена специализация (8)
LWG 3541 C++20 LWG 3446 вызвал жёсткую ошибку в неоднозначных случаях,
когда value_type и element_type различаются
добавлена специализация (7)

См. также

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/cpp/iterator/indirectly_readable_traits

Spec-Zone.ru

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