std::indirectly_readable_traits
| Definiert in Header <iterator> |
||
| template< class I > struct indirectly_readable_traits {}; |
(1) | (seit C++20) |
| template< class T > struct indirectly_readable_traits<T*> : |
(2) | (seit C++20) |
| template< class I > requires std::is_array_v<I> |
(3) | (seit C++20) |
| template< class T > struct indirectly_readable_traits<const T> : |
(4) | (seit C++20) |
| template< /* has-member-value-type */ T > struct indirectly_readable_traits<T> : |
(5) | (seit C++20) |
| template< /* has-member-element-type */ T > struct indirectly_readable_traits<T> : |
(6) | (seit C++20) |
| template< /* has-member-value-type */ T > requires /* has-member-element-type */<T> |
(7) | (seit C++20) |
| template< /* has-member-value-type */ T > requires /* has-member-element-type */<T> && |
(8) | (seit C++20) |
| Hilfsklassen und Konzepte |
||
| template< class > struct /* cond-value-type */ {}; |
(1) | (nur Exposition*) |
| template< class T > requires std::is_object_v<T> |
(2) | (nur Exposition*) |
| template< class T > concept /* has-member-value-type */ = |
(3) | (nur Exposition*) |
| template< class T > concept /* has-member-element-type */ = |
(4) | (nur Exposition*) |
Berechnet den zugehörigen Werttyp des Template-Arguments. Wenn der zugehörige Werttyp existiert, wird er durch den verschachtelten Typ value_type dargestellt, andernfalls ist value_type nicht definiert. Ein Programm kann indirectly_readable_traits für einen vom Programm definierten Typ spezialisieren.
Inhalt |
[bearbeiten] Erklärung
Die obigen Spezialisierungen können informell wie folgt beschrieben werden.
Gegeben sei ein Typ T, sein zugehöriger Werttyp V wird wie folgt bestimmt:
- Wenn
Tconst-qualifiziert ist, istVder zugehörige Werttyp des const-unqualifiziertenT. - Andernfalls, wenn
Tein Array-Typ ist, istVder cv-unqualifizierte Array-Elementtyp. - Andernfalls wird zuerst ein bedingter Werttyp
Cbestimmt.
- Wenn
Tein Zeigertyp ist, istCder zeigertyp. - Andernfalls, wenn
Tdie verschachtelten Typenvalue_typeundelement_typehat
- Wenn diese Typen gleich sind (ohne Berücksichtigung der cv-Qualifikation), ist
Ctypename T::value_type. - Andernfalls ist
Cundefiniert.
- Wenn diese Typen gleich sind (ohne Berücksichtigung der cv-Qualifikation), ist
- Andernfalls, wenn
Tden verschachtelten Typvalue_type, aber nichtelement_typehat, istCtypename T::value_type. - Andernfalls, wenn
Tden verschachtelten Typelement_type, aber nichtvalue_typehat, istCtypename T::element_type. - Andernfalls ist
Cundefiniert.
- Wenn
- Dann wird
VausCwie folgt bestimmt:- Wenn
Cundefiniert ist oderCkein Objekttyp ist, istVundefiniert. - Andernfalls ist
Vcv-unqualifiziertC.
- Wenn
[bearbeiten] Anmerkungen
value_type ist für die Verwendung mit indirectly_readable-Typen wie Iteratoren vorgesehen. Es ist nicht für die Verwendung mit Ranges vorgesehen.
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3446 | C++20 | Spezialisierungen (5,6) waren mehrdeutig für Typen, die sowohl value_type als auch element_type verschachtelte Typen hatten |
Spezialisierung (8) hinzugefügt |
| LWG 3541 | C++20 | LWG 3446 führte zu einem harten Fehler für mehrdeutige Fälle dass value_type und element_type unterschiedlich sind |
Spezialisierung (7) hinzugefügt |
[bearbeiten] Siehe auch
| (C++20) |
spezifiziert, dass ein Typ durch Anwendung des Operators * indirekt lesbar ist(Konzept) |
| (C++20)(C++20)(C++23)(C++20)(C++20)(C++20) |
berechnet die zugehörigen Typen eines Iterators (Alias-Schablone) |
| bietet eine einheitliche Schnittstelle zu den Eigenschaften eines Iterators (Klassenschablone) |