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
>
|
(3) | (начиная с C++20) |
|
template
<
class
T
>
struct
indirectly_readable_traits
<
const
T
>
:
|
(4) | (начиная с C++20) |
|
template
<
/* имеет-член-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
>
|
(7) | (начиная с C++20) |
|
template
<
/* has-member-value-type */
T
>
requires
/* has-member-element-type */
<
T
>
&&
|
(8) | (начиная с C++20) |
|
Вспомогательные классы и концепции
|
||
|
template
<
class
>
struct /* cond-value-type */ { } ; |
(1) | ( только для демонстрации* ) |
|
template
<
class
T
>
requires
std::
is_object_v
<
T
>
|
(2) | ( только для демонстрации* ) |
|
template
<
class
T
>
concept
/* имеет-член-value-type */
=
|
(3) | ( только для демонстрации* ) |
|
template
<
class
T
>
concept
/* имеет-член-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не определен.
-
Если эти типы одинаковы (без учета cv-квалификаторов),
-
В противном случае, если
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) |
Смотрите также
|
(C++20)
|
определяет, что тип является косвенно читаемым посредством применения оператора
*
(концепт) |
|
(C++20)
(C++20)
(C++23)
(C++20)
(C++20)
(C++20)
|
вычисляет ассоциированные типы итератора
(псевдоним шаблона) |
|
предоставляет унифицированный интерфейс к свойствам итератора
(шаблон класса) |