Namensräume
Varianten
Aktionen

std::indirectly_readable_traits

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
(veraltet in C++17)
indirectly_readable_traits
(C++20)


Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
Definiert in Header <iterator>
template< class I >
struct indirectly_readable_traits {};
(1) (seit C++20)
template< class T >

struct indirectly_readable_traits<T*> :

    /* cond-value-type */<T> {};
(2) (seit 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) (seit C++20)
template< class T >

struct indirectly_readable_traits<const T> :

    indirectly_readable_traits<T> {};
(4) (seit C++20)
template< /* has-member-value-type */ T >

struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::value_type> {};
(5) (seit C++20)
template< /* has-member-element-type */ T >

struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::element_type> {};
(6) (seit C++20)
template< /* has-member-value-type */ T >

    requires /* has-member-element-type */<T>

struct indirectly_readable_traits<T> {};
(7) (seit 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) (seit C++20)
Hilfsklassen und Konzepte
template< class >
struct /* cond-value-type */ {};
(1) (nur Exposition*)
template< class T >

    requires std::is_object_v<T>
struct /* cond-value-type */ <T>

{ using value_type = std::remove_cv_t<T>; };
(2) (nur Exposition*)
template< class T >

concept /* has-member-value-type */ =

    requires { typename T::value_type; };
(3) (nur Exposition*)
template< class T >

concept /* has-member-element-type */ =

    requires { typename T::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 T const-qualifiziert ist, ist V der zugehörige Werttyp des const-unqualifizierten T.
  • Andernfalls, wenn T ein Array-Typ ist, ist V der cv-unqualifizierte Array-Elementtyp.
  • Andernfalls wird zuerst ein bedingter Werttyp C bestimmt.
  • Wenn T ein Zeigertyp ist, ist C der zeigertyp.
  • Andernfalls, wenn T die verschachtelten Typen value_type und element_type hat
  • Wenn diese Typen gleich sind (ohne Berücksichtigung der cv-Qualifikation), ist C typename T::value_type.
  • Andernfalls ist C undefiniert.
  • Andernfalls, wenn T den verschachtelten Typ value_type, aber nicht element_type hat, ist C typename T::value_type.
  • Andernfalls, wenn T den verschachtelten Typ element_type, aber nicht value_type hat, ist C typename T::element_type.
  • Andernfalls ist C undefiniert.
Dann wird V aus C wie folgt bestimmt:
  • Wenn C undefiniert ist oder C kein Objekttyp ist, ist V undefiniert.
  • Andernfalls ist V cv-unqualifiziert C.

[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

[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

spezifiziert, dass ein Typ durch Anwendung des Operators * indirekt lesbar ist
(Konzept) [bearbeiten]
berechnet die zugehörigen Typen eines Iterators
(Alias-Schablone)[bearbeiten]
bietet eine einheitliche Schnittstelle zu den Eigenschaften eines Iterators
(Klassenschablone) [bearbeiten]