is-integer-like , is-signed-integer-like
|
template
<
class
T
>
constexpr bool /*is-integer-like*/ = /* siehe Beschreibung */ ; |
(1) |
(seit C++20)
( nur zur Darstellung* ) |
|
template
<
class
T
>
constexpr bool /*is-signed-integer-like*/ = /* siehe Beschreibung */ ; |
(2) |
(seit C++20)
( nur zur Darstellung* ) |
T
ein integer-ähnlicher Typ ist.
T
ein signed-integer-like Typ ist.
Inhaltsverzeichnis |
Integer-Klassentyp
Ein Typ
T
ist ein
integer-class type
, wenn er zu einer Menge von implementierungsdefinierten Typen gehört, die sich wie
integer types
verhalten, wie
unten
definiert. Ein integer-class type ist nicht notwendigerweise ein
class type
.
Ein Integer-Klassen-Typ kann
2
N
aufeinanderfolgende Integer-Werte darstellen, wobei
N
, eine positive ganze Zahl, als
Breite
des Integer-Klassen-Typs bezeichnet wird.
Ein Integer-Klassen-Typ ist entweder vorzeichenbehaftet oder vorzeichenlos:
-
Ein
vorzeichenbehafteter Ganzzahl-Klassentyp
kann alle ganzen Zahlen im Bereich
[-2 N-1
,2 N-1
-1]darstellen, wobei N größer ist als die Breite jedes vorzeichenbehafteten integralen Typs. -
Ein
vorzeichenloser Ganzzahl-Klassentyp
kann alle ganzen Zahlen im Bereich
[0,2 N
-1]darstellen, wobei N größer ist als die Breite jedes vorzeichenlosen integralen Typs.
Alle Ganzzahl-Klassentypen modellieren
regular
und
three_way_comparable
<
std::
strong_ordering
>
.
Ein wertinitialisiertes Objekt vom Integer-Klassentyp hat den Wert 0 .
Ein Ausdruck
E
vom Integer-Class-Typ
T
ist
kontextuell konvertierbar
zu
bool
als ob durch
bool
(
E
!
=
T
(
0
)
)
.
Integer-ähnlicher Typ
Ein anderer Typ als (möglicherweise cv-qualifiziert)
bool
ist
integer-like
, wenn er das Konzept
integral
modelliert oder wenn es sich um einen integer-class Typ handelt.
-
Ein integer-ähnlicher Typ ist
signed-integer-like
wenn er das Konzept
signed_integralmodelliert oder wenn es sich um einen signed-integer-class Typ handelt. -
Ein integer-ähnlicher Typ ist
unsigned-integer-like
wenn er das Konzept
unsigned_integralmodelliert oder wenn es sich um einen unsigned-integer-class Typ handelt.
Erforderliche Verhaltensweisen
Ausdrücke vom Typ Integer-Klasse sind explizit in jeden integer-ähnlichen Typ konvertierbar und implizit in jeden Integer-Klassen-Typ mit gleicher oder größerer Breite und demselben Vorzeichen. Ausdrücke von Ganzzahltyp sind sowohl implizit als auch explizit in jeden Integer-Klassen-Typ konvertierbar. Konvertierungen zwischen Ganzzahl- und Integer-Klassen-Typen sowie zwischen zwei Integer-Klassen-Typen werfen keine Exception. Das Ergebnis einer solchen Konvertierung ist der eindeutige Wert des Zieltyps, der kongruent zur Quelle modulo
2
N
ist, wobei
N
die Breite des Zieltyps ist.
Sei
Int<T>
der folgende Typ:
-
Wenn
Tein Integer-Klassentyp ist,Int<T>ein eindeutiger hypothetischer erweiterter Ganzzahltyp mit demselben Vorzeichen und derselben Breite wieTist. -
Wenn
Tein integraler Typ ist, seiInt<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 repräsentiert wie
a
|
| y |
ein Objekt vom Typ
Int<IL>
, das denselben Wert repräsentiert wie
b
|
| Operator | Definition |
| @ = | einer von + = , - = , * = , / = , % = , & = , | = , ^ = , <<= und >>= |
| @ | einer von + , - , * , / , % , & , | , ^ , << , >> , && , || , == , ! = , < , > , <= , >= , <=> und , |
Die folgenden Ausdrücke müssen wohlgeformt sein und ihr spezifiziertes Ergebnis sowie ihre Effekte haben, wenn die spezifizierten Bedingungen erfüllt sind:
| Ausdruck | Bedingung | Ergebnis | Effekte |
|---|---|---|---|
| a ++ | Keine Bedingung |
ein prvalue vom Typ
IC
dessen Wert gleich dem von
a
vor der Auswertung ist
|
modifiziert den Wert von a durch Addition von 1 |
| a -- | verändert den Wert von a durch Subtraktion von 1 | ||
| ++ a | ausdrucksäquivalent zu a + = 1 | ||
| -- a | Ausdruck äquivalent zu a - = 1 | ||
| & a | Ausdruck äquivalent zu std:: addressof ( a ) | ||
| ! a | ! x ist wohlgeformt | gleich wie ! x | |
| + a | + x ist wohlgeformt |
identisch zu
+
x
, hat jedoch den Typ
IC
|
identisch zu + x |
| - a | - x ist wohlgeformt |
dasselbe wie
-
x
, aber hat den Typ
IC
|
dasselbe wie - x |
| ~a | ~x ist wohlgeformt |
gleich wie
~x
, aber hat Typ
IC
|
gleich wie ~x |
| c @ = a | c @ = x ist wohlgeformt | ein Lvalue, der auf c referenziert | identisch zu c @ = x |
| a @ = b | x @ = y ist wohlgeformt | ein Lvalue, der auf a referenziert | identisch zu x @ = y , außer dass der Wert, der in x gespeichert würde, in a gespeichert wird |
| a @ b | x @ y ist wohlgeformt |
gleich wie
x @ y
, aber der Ergebnistyp ist unterschiedlich:
|
gleich wie x @ y |
| b @ a | y @ x ist wohlgeformt |
gleich wie
y @ x
, aber der Ergebnistyp ist unterschiedlich:
|
gleich wie y @ x |
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
|
LWG 3366
( P2393R1 ) |
C++20 |
Die Konvertierung zwischen einem Integer-Class-Typ und seinem entsprechenden
Integer-Typ war nicht garantiert, einen darstellbaren Wert zu erzeugen |
garantiert |
|
LWG 3376
( P2393R1 ) |
C++20 | Integer-Class-Typen konnten nur Klassentypen sein |
auch Nicht-Klassentypen
erlaubt |
| LWG 3467 | C++20 | bool wurde als ein Integer-ähnlicher Typ betrachtet | ausgeschlossen |
|
LWG 3575
( P2393R1 ) |
C++20 | Für Integer-Class-Typen war nicht garantiert, dass sie three-way-vergleichbar sind | garantiert |
Siehe auch
|
(C++20)
|
spezifiziert, dass ein
semiregular
Typ mit Prä- und Post-Inkrementoperatoren inkrementiert werden kann
(Konzept) |