std::indirectly_readable_traits - cppreference.com (original) (raw)
| Defined in header | ||
|---|---|---|
| template< class I > struct indirectly_readable_traits {}; | (1) | (since C++20) |
| template< class T > struct indirectly_readable_traits<T*> : /* cond-value-type */<T> {}; | (2) | (since 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) | (since C++20) |
| template< class T > struct indirectly_readable_traits<const T> : indirectly_readable_traits<T> {}; | (4) | (since C++20) |
| template< /* has-member-value-type */ T > struct indirectly_readable_traits<T> : /* cond-value-type */<typename T::value_type> {}; | (5) | (since C++20) |
| template< /* has-member-element-type */ T > struct indirectly_readable_traits<T> : /* cond-value-type */<typename T::element_type> {}; | (6) | (since C++20) |
| template< /* has-member-value-type */ T > requires /* has-member-element-type */<T> struct indirectly_readable_traits<T> {}; | (7) | (since 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) | (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> struct /* cond-value-type */ <T> { using value_type = std::remove_cv_t<T>; }; | (2) | (exposition only*) |
| template< class T > concept /* has-member-value-type */ = requires { typename T::value_type; }; | (3) | (exposition only*) |
| template< class T > concept /* has-member-element-type */ = requires { typename T::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.
[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
Tis const-qualified,Vis the associated value type of const-unqualifiedT.Otherwise, if
Tis an array type,Vis the cv-unqualified array element type.Otherwise, a conditional value type
Cis determined first:If
Tis a pointer type,Cis the pointed-to type.Otherwise, if
Thas nested typesvalue_typeandelement_type:If these types are the same (not considering cv-qualification),
Cistypename T::value_type.Otherwise,
Cis undefined.Otherwise, if
Thas the nested typevalue_typebut notelement_type,Cistypename T::value_type.Otherwise, if
Thas the nested typeelement_typebut notvalue_type,Cistypename T::element_type.Otherwise,
Cis undefined.
Then V is determined from C as follows:
- If
Cis undefined, orCis not an object type,Vis undefined. - Otherwise,
Vis cv-unqualifiedC.
[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
[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 havingboth value_type and element_type nested types | added specialization (8) |
| LWG 3541 | C++20 | LWG 3446 introduced hard error for ambiguous casesthat value_type and element_type are different | added specialization (7) |