std::indirectly_readable_traits
Defined in header <iterator> | ||
template<class I > struct indirectly_readable_traits {}; | (1) | (since C++20) |
template<class T > struct indirectly_readable_traits<T*>: | (2) | (since C++20) |
template<class I > requires std::is_array_v<I> | (3) | (since C++20) |
template<class T > struct indirectly_readable_traits<const T>: | (4) | (since C++20) |
template</* has-member-value-type */ T > struct indirectly_readable_traits<T>: | (5) | (since C++20) |
template</* has-member-element-type */ T > struct indirectly_readable_traits<T>: | (6) | (since C++20) |
template</* has-member-value-type */ T > requires /* has-member-element-type */<T> | (7) | (since C++20) |
template</* has-member-value-type */ T > requires /* has-member-element-type */<T>&& | (8) | (since C++20) |
Helper classes and concepts | ||
template<class> struct/* cond-value-type */{}; | (1) | (exposition only*) |
template<class T > requires std::is_object_v<T> | (2) | (exposition only*) |
template<class T > concept /* has-member-value-type */= | (3) | (exposition only*) |
template<class T > concept /* has-member-element-type */= | (4) | (exposition only*) |
Computes the associated value type of the template argument. If the associated value type exists, it is represented by the nested type value_type
, otherwise value_type
is not defined. A program may specialize indirectly_readable_traits
for a program-defined type.
Contents |
[edit]Explanation
The specializations above can be informally described as below.
Given a type T
, its associated value type V
is determined as follows:
- If
T
is const-qualified,V
is the associated value type of const-unqualifiedT
. - Otherwise, if
T
is an array type,V
is the cv-unqualified array element type. - Otherwise, a conditional value type
C
is determined first:
- If
T
is a pointer type,C
is the pointed-to type. - Otherwise, if
T
has nested typesvalue_type
andelement_type
:
- If these types are the same (not considering cv-qualification),
C
istypename T::value_type
. - Otherwise,
C
is undefined.
- If these types are the same (not considering cv-qualification),
- Otherwise, if
T
has the nested typevalue_type
but notelement_type
,C
istypename T::value_type
. - Otherwise, if
T
has the nested typeelement_type
but notvalue_type
,C
istypename T::element_type
. - Otherwise,
C
is undefined.
- If
- Then
V
is determined fromC
as follows:- If
C
is undefined, orC
is not an object type,V
is undefined. - Otherwise,
V
is cv-unqualifiedC
.
- If
[edit]Notes
value_type
is intended for use with indirectly_readable
types such as iterators. It is not intended for use with ranges.
[edit]Example
This section is incomplete Reason: no example |
[edit]Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3446 | C++20 | specializations (5,6) were ambiguous for types having both value_type and element_type nested types | added specialization (8) |
LWG 3541 | C++20 | LWG 3446 introduced hard error for ambiguous cases that value_type and element_type are different | added specialization (7) |
[edit]See also
(C++20) | specifies that a type is indirectly readable by applying operator * (concept) |
(C++20)(C++20)(C++23)(C++20)(C++20)(C++20) | computes the associated types of an iterator (alias template) |
provides uniform interface to the properties of an iterator (class template) |