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) |
См. также
|
(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/cpp/iterator/indirectly_readable_traits