ist-integer-like , ist-signed-integer-like
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*) |
T ein Integer-ähnlicher Typ ist.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
[0,2N
-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_integralmodelliert oder wenn er ein vorzeichenbehafteter Integer-Klassen-Typ ist. - Ein Integer-ähnlicher Typ ist vorzeichenlos-integer-ähnlich, wenn er
unsigned_integralmodelliert 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
Tein Integer-Klassen-Typ ist, istInt<T>ein eindeutiger hypothetischer erweiterter ganzzahliger Typ gleicher Vorzeichenbehaftung mit derselben Breite wieT. - Wenn
Tein ganzzahliger Typ ist, istInt<T>derselbe Typ wieT.
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
|
dasselbe wie x @ y |
| b @ a | y @ x ist wohlgeformt | dasselbe wie y @ x, aber der Ergebnistyp ist anders
|
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
| (C++20) |
spezifiziert, dass ein semiregular-Typ mit Prä- und Post-Inkrementoperatoren inkrementiert werden kann(Konzept) |