Namensräume
Varianten
Aktionen

ist-integer-like , ist-signed-integer-like

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
is-integer-like
is-signed-integer-like
(C++20)(C++20)
Iterator-Primitive
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)
 
template< class T >
constexpr bool /*ist-integer-like*/ = /* siehe Beschreibung */;
(1) (seit C++20)
(nur Exposition*)
template< class T >
constexpr bool /*ist-signed-integer-like*/ = /* siehe Beschreibung */;
(2) (seit C++20)
(nur Exposition*)
1) /*ist-integer-like*/<T> ist true genau dann, wenn T ein Integer-ähnlicher Typ ist.
2) /*ist-signed-integer-like*/<T> ist true genau dann, wenn T ein vorzeichenbehafteter Integer-ähnlicher Typ ist.

Inhalt

[bearbeiten] Integer-Klassen-Typ

Ein Typ T ist ein Integer-Klassen-Typ, wenn er zu einer Menge von implementierungsabhängigen Typen gehört, die sich wie Integer-Typen verhalten, wie nachstehend definiert. Ein Integer-Klassen-Typ ist nicht notwendigerweise ein Klassentyp.

Ein Integer-Klassen-Typ kann 2N
aufeinanderfolgende ganze Zahlen darstellen, wobei N, eine positive ganze Zahl, die Breite des Integer-Klassen-Typs genannt wird.

Ein Integer-Klassen-Typ ist entweder vorzeichenbehaftet oder vorzeichenlos

  • Ein vorzeichenbehafteter Integer-Klassen-Typ kann alle ganzen Zahlen im Bereich [-2N-1
    2N-1
    -1
    ]
    darstellen, wobei N größer ist als die Breite jedes vorzeichenbehafteten ganzzahligen Typs.
  • Ein vorzeichenloser Integer-Klassen-Typ kann alle ganzen Zahlen im Bereich [02N
    -1
    ]
    darstellen, wobei N größer ist als die Breite jedes vorzeichenlosen ganzzahligen Typs.

Alle Integer-Klassen-Typen modellieren regular und three_way_comparable<std::strong_ordering>.

Ein wertinitialisiertes Objekt eines Integer-Klassen-Typs hat den Wert 0.

Ein Ausdruck E eines Integer-Klassen-Typs T ist kontextbezogen konvertierbar zu bool, als ob durch bool(E != T(0)).

[bearbeiten] Integer-ähnlicher Typ

Ein Typ, der nicht (möglicherweise cv-qualifiziertes) bool ist, ist Integer-ähnlich, wenn er integral modelliert oder wenn er ein Integer-Klassen-Typ ist.

  • Ein Integer-ähnlicher Typ ist vorzeichenbehaftet-integer-ähnlich, wenn er signed_integral modelliert oder wenn er ein vorzeichenbehafteter Integer-Klassen-Typ ist.
  • Ein Integer-ähnlicher Typ ist vorzeichenlos-integer-ähnlich, wenn er unsigned_integral modelliert oder wenn er ein vorzeichenloser Integer-Klassen-Typ ist.

[bearbeiten] Erforderliche Verhaltensweisen

Ausdrücke vom Integer-Klassen-Typ sind explizit zu jedem Integer-ähnlichen Typ konvertierbar und implizit zu jedem Integer-Klassen-Typ gleicher oder größerer Breite und gleicher Vorzeichenbehaftung konvertierbar. Ausdrücke vom ganzzahligen Typ sind sowohl implizit als auch explizit zu jedem Integer-Klassen-Typ konvertierbar. Konvertierungen zwischen ganzzahligen und Integer-Klassen-Typen und zwischen zwei Integer-Klassen-Typen werden nicht über eine Ausnahme verlassen. Das Ergebnis einer solchen Konvertierung ist der eindeutige Wert des Zieltyps, der kongruent zum Quellwert modulo 2N
ist, wobei N die Breite des Zieltyps ist.

Sei Int<T> der folgende Typ

  • Wenn T ein Integer-Klassen-Typ ist, ist Int<T> ein eindeutiger hypothetischer erweiterter ganzzahliger Typ gleicher Vorzeichenbehaftung mit derselben Breite wie T.
  • Wenn T ein ganzzahliger Typ ist, ist Int<T> derselbe Typ wie T.

Gegeben die folgenden Typen, Werte und Operatoren

Typ Definition
IC ein Integer-Klassen-Typ
IL ein Integer-ähnlicher Typ
Wert Definition
a ein Objekt vom Typ IC
b ein Objekt vom Typ IL
c ein lvalue eines ganzzahligen Typs
x ein Objekt vom Typ Int<IC>, das denselben Wert wie a darstellt
y ein Objekt vom Typ Int<IL>, das denselben Wert wie b darstellt
Operator Definition
@= einer der Operatoren +=, -=, *=, /=, %=, &=, |=, ^=, <<= und >>=
@ einer der Operatoren +, -, *, /, %, &, |, ^, <<, >>, &&, ||, ==, !=, <, >, <=, >=, <=> und ,

Die folgenden Ausdrücke müssen wohlgeformt sein und ihr angegebenes Ergebnis und ihre angegebenen Effekte haben, wenn die angegebenen Bedingungen erfüllt sind

 Ausdruck            Bedingung           Ergebnis Effekte
a++ Keine Bedingung ein prvalue vom Typ IC, dessen Wert dem von a vor der Auswertung entspricht modifiziert den Wert von a, indem 1 zu diesem addiert wird
a-- modifiziert den Wert von a, indem 1 von diesem subtrahiert wird
++a entspricht a += 1 in Bezug auf den Ausdruck
--a entspricht a -= 1 in Bezug auf den Ausdruck
&a entspricht std::addressof(a) in Bezug auf den Ausdruck
!a !x ist wohlgeformt dasselbe wie !x
+a +x ist wohlgeformt dasselbe wie +x, hat aber den Typ IC dasselbe wie +x
-a -x ist wohlgeformt dasselbe wie -x, hat aber den Typ IC dasselbe wie -x
~a ~x ist wohlgeformt dasselbe wie ~x, hat aber den Typ IC dasselbe wie ~x
c @= a c @= x ist wohlgeformt ein lvalue, der auf c verweist dasselbe wie c @= x
a @= b x @= y ist wohlgeformt ein lvalue, der auf a verweist dasselbe wie x @= y, mit dem Unterschied, dass der Wert, der in x gespeichert werden würde, in a gespeichert wird
a @ b x @ y ist wohlgeformt dasselbe wie x @ y, aber der Ergebnistyp ist anders
  • Wenn x @ y vom Typ Int<IC> ist, hat das Ergebnis den Typ IC.
  • Wenn x @ y vom Typ Int<IL> ist, hat das Ergebnis den Typ IL.
  • Wenn x @ y von einem anderen Typ T ist, hat das Ergebnis den Typ T.
dasselbe wie x @ y
b @ a y @ x ist wohlgeformt dasselbe wie y @ x, aber der Ergebnistyp ist anders
  • Wenn y @ x vom Typ Int<IC> ist, hat das Ergebnis den Typ IC.
  • Wenn y @ x vom Typ Int<IL> ist, hat das Ergebnis den Typ IL.
  • Wenn y @ x von einem anderen Typ T ist, hat das Ergebnis den Typ T.
dasselbe wie y @ x

[bearbeiten] Defect reports

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 3366
(P2393R1)
C++20 die Konvertierung zwischen einem Integer-Klassen-Typ und seinem entsprechenden
Integer-Typ garantierte kein darstellbares Ergebnis
garantiert
LWG 3376
(P2393R1)
C++20 Integer-Klassen-Typen konnten nur Klassentypen sein auch erlaubt
Nicht-Klassentypen
LWG 3467 C++20 bool wurde als Integer-ähnlicher Typ betrachtet ausgeschlossen
LWG 3575
(P2393R1)
C++20 Integer-Klassen-Typen waren nicht garantiert three-way-vergleichbar garantiert

[bearbeiten] Siehe auch

spezifiziert, dass ein semiregular-Typ mit Prä- und Post-Inkrementoperatoren inkrementiert werden kann
(Konzept) [bearbeiten]