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*/ = /* 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* )
1) /*is-integer-like*/ < T > es true si y solo si T es un tipo integer-like.
2) /*is-signed-integer-like*/ < T > es true si y solo si 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_integral o si es un tipo de clase entera con signo.
  • Un tipo similar a entero es similar a entero sin signo si modela unsigned_integral o 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 T es 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 que T .
  • Si T es un tipo integral, sea Int<T> el mismo tipo que T .

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:
  • Si x @ y es de tipo Int<IC> , el resultado tiene tipo IC .
  • Si x @ y es de tipo Int<IL> , el resultado tiene tipo IL .
  • Si x @ y es de cualquier otro tipo T , el resultado tiene tipo T .
igual que x @ y
b @ a y @ x está bien formado igual que y @ x , pero el tipo de resultado es diferente:
  • Si y @ x es de tipo Int<IC> , el resultado tiene tipo IC .
  • Si y @ x es de tipo Int<IL> , el resultado tiene tipo IL .
  • Si y @ x es de cualquier otro tipo T , el resultado tiene tipo T .
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

especifica que un tipo semiregular puede ser incrementado con operadores de pre-incremento y post-incremento
(concepto)