is-integer-like , is-signed-integer-like
|
template
<
class
T
>
constexpr bool /*is-integer-like*/ = /* ver descripción */ ; |
(1) |
(desde C++20)
( solo para exposición* ) |
|
template
<
class
T
>
constexpr bool /*is-signed-integer-like*/ = /* ver descripción */ ; |
(2) |
(desde C++20)
( solo para exposición* ) |
T
es un tipo integer-like.
T
es un tipo similar a entero con signo.
Contenidos |
Tipo de clase entera
Un tipo
T
es un
tipo de clase entera
si pertenece a un conjunto de tipos definidos por la implementación que se comportan como lo hacen los
tipos enteros
, según se define
a continuación
. Un tipo de clase entera no es necesariamente un
tipo clase
.
Un tipo de clase entera puede representar
2
N
enteros consecutivos, donde
N
, un entero positivo, se denomina
width
del tipo de clase entera.
Un tipo de clase entera es con signo o sin signo:
-
Un
tipo de clase entero con signo
puede representar todos los enteros en
[-2 N-1
,2 N-1
-1], donde N es mayor que el ancho de cada tipo integral con signo. -
Un
tipo de clase entero sin signo
puede representar todos los enteros en
[0,2 N
-1], donde N es mayor que el ancho de cada tipo integral sin signo.
Todos los tipos de clase entera modelan
regular
y
three_way_comparable
<
std::
strong_ordering
>
.
Un objeto value-initialized de tipo integer-class tiene el valor 0 .
Una expresión
E
de tipo integer-class
T
es
contextualmente convertible
a
bool
como si fuera mediante
bool
(
E
!
=
T
(
0
)
)
.
Tipo similar a entero
Un tipo que no sea (posiblemente calificado con cv)
bool
es
similar a entero
si modela
integral
o si es un tipo de clase entera.
-
Un tipo similar a entero es
similar a entero con signo
si modela
signed_integralo si es un tipo de clase entera con signo. -
Un tipo similar a entero es
similar a entero sin signo
si modela
unsigned_integralo si es un tipo de clase entera sin signo.
Comportamientos requeridos
Las expresiones de tipo integer-class son explícitamente convertibles a cualquier tipo integer-like, e implícitamente convertibles a cualquier tipo integer-class de igual o mayor ancho y la misma signatura. Las expresiones de tipo integral son tanto implícita como explícitamente convertibles a cualquier tipo integer-class. Las conversiones entre tipos integral e integer-class y entre dos tipos integer-class no finalizan mediante una excepción. El resultado de dicha conversión es el valor único del tipo destino que es congruente con el origen módulo
2
N
, donde
N
es el ancho del tipo destino.
Sea
Int<T>
el tipo siguiente:
-
Si
Tes un tipo de clase entera,Int<T>es un hipotético tipo entero extendido único extended integer type con el mismo signo y el mismo ancho queT. -
Si
Tes un tipo integral, seaInt<T>el mismo tipo queT.
Dados los siguientes tipos, valores y operadores:
| Tipo | Definición |
IC
|
un tipo de clase entera |
IL
|
un tipo similar a entero |
| Valor | Definición |
| a |
un objeto de tipo
IC
|
| b |
un objeto de tipo
IL
|
| c | un lvalue de tipo entero |
| x |
un objeto de tipo
Int<IC>
que representa el mismo valor que
a
|
| y |
un objeto de tipo
Int<IL>
que representa el mismo valor que
b
|
| Operador | Definición |
| @ = | uno de + = , - = , * = , / = , % = , & = , | = , ^ = , <<= y >>= |
| @ | uno de + , - , * , / , % , & , | , ^ , << , >> , && , || , == , ! = , < , > , <= , >= , <=> y , |
Las siguientes expresiones deben estar bien formadas y tener su resultado y efectos especificados si se cumplen las condiciones indicadas:
| Expresión | Condición | Resultado | Efectos |
|---|---|---|---|
| a ++ | Sin condición |
un prvalue de tipo
IC
cuyo valor es igual al de
a
previo a la evaluación
|
modifica el valor de a sumándole 1 |
| a -- | modifica el valor de a restando 1 a este | ||
| ++ a | equivalente-expresión a a + = 1 | ||
| -- a | expresión equivalente a a - = 1 | ||
| & a | expresión-equivalente a std:: addressof ( a ) | ||
| ! a | ! x está bien formado | igual que ! x | |
| + a | + x está bien formado |
igual que
+
x
, pero tiene tipo
IC
|
igual que + x |
| - a | - x está bien formado |
igual que
-
x
, pero tiene tipo
IC
|
igual que - x |
| ~a | ~x está bien formado |
igual que
~x
, pero tiene tipo
IC
|
igual que ~x |
| c @ = a | c @ = x está bien formado | un lvalue que hace referencia a c | igual que c @ = x |
| a @ = b | x @ = y está bien formado | un lvalue que hace referencia a a | igual que x @ = y , excepto que el valor que se almacenaría en x se almacena en a |
| a @ b | x @ y está bien formado |
igual que
x @ y
, pero el tipo de resultado es diferente:
|
igual que x @ y |
| b @ a | y @ x está bien formado |
igual que
y @ x
, pero el tipo de resultado es diferente:
|
igual que y @ x |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
|
LWG 3366
( P2393R1 ) |
C++20 |
la conversión entre un tipo integer-class y su tipo entero correspondiente
no estaba garantizada para producir un valor representable |
garantizada |
|
LWG 3376
( P2393R1 ) |
C++20 | los tipos integer-class solo podían ser tipos clase |
también permitidos
tipos no-clase |
| LWG 3467 | C++20 | bool era considerado como un tipo integer-like | excluido |
|
LWG 3575
( P2393R1 ) |
C++20 | los tipos integer-class no estaban garantizados para ser three-way-comparable | garantizado |
Véase también
|
(C++20)
|
especifica que un tipo
semiregular
puede ser incrementado con operadores de pre-incremento y post-incremento
(concepto) |