Namespaces
Variants

is-integer-like , is-signed-integer-like

From cppreference.net
Iterator library
Iterator concepts
is-integer-like
is-signed-integer-like
(C++20) (C++20)
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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 /*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* )
1) /*is-integer-like*/ < T > ist true genau dann, wenn T ein integer-ähnlicher Typ ist.
2) /*is-signed-integer-like*/ < T > ist true genau dann, wenn 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_integral modelliert oder wenn es sich um einen signed-integer-class Typ handelt.
  • Ein integer-ähnlicher Typ ist unsigned-integer-like wenn er das Konzept unsigned_integral modelliert 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 T ein Integer-Klassentyp ist, Int<T> ein eindeutiger hypothetischer erweiterter Ganzzahltyp mit demselben Vorzeichen und derselben Breite wie T ist.
  • Wenn T ein integraler Typ ist, sei 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 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:
  • Falls x @ y vom Typ Int<IC> ist, hat das Ergebnis den Typ IC .
  • Falls x @ y vom Typ Int<IL> ist, hat das Ergebnis den Typ IL .
  • Falls x @ y von einem anderen Typ T ist, hat das Ergebnis den Typ T .
gleich wie x @ y
b @ a y @ x ist wohlgeformt gleich wie y @ x , aber der Ergebnistyp ist unterschiedlich:
  • 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 .
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

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