Namespaces
Variants

std:: indirectly_readable_traits

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
(deprecated in C++17)
indirectly_readable_traits
(C++20)


Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
Определено в заголовке <iterator>
template < class I >
struct indirectly_readable_traits { } ;
(1) (начиная с C++20)
template < class T >

struct indirectly_readable_traits < T * > :

/* тип-условного-значения */ < 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 < /* имеет-член-value-type */ T >

struct indirectly_readable_traits < T > :

/* условный-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 /* имеет-член-value-type */ =

requires { typename T :: value_type ; } ;
(3) ( только для демонстрации* )
template < class T >

concept /* имеет-член-element-type */ =

requires { typename T :: element_type ; } ;
(4) ( только для демонстрации* )

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

Содержание

Объяснение

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

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

  • Если T квалифицирован как const, V является ассоциированным типом значения без квалификатора const для T .
  • Иначе, если 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 не является object type , V не определен.
  • В противном случае, V является cv-неквалифицированным C .

Примечания

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

Пример

Отчеты о дефектах

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

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

Смотрите также

определяет, что тип является косвенно читаемым посредством применения оператора *
(концепт)
вычисляет ассоциированные типы итератора
(псевдоним шаблона)
предоставляет унифицированный интерфейс к свойствам итератора
(шаблон класса)