is-integer-like , is-signed-integer-like
|
template
<
class
T
>
constexpr bool /*is-integer-like*/ = /* see description */ ; |
(1) |
(начиная с C++20)
( только для демонстрации* ) |
|
template
<
class
T
>
constexpr bool /*is-signed-integer-like*/ = /* see description */ ; |
(2) |
(начиная с C++20)
( только для демонстрации* ) |
T
является целочисленным типом.
T
является signed-integer-like типом.
Содержание |
Целочисленный тип класса
Тип
T
является
целочисленно-подобным типом
, если он принадлежит к набору определяемых реализацией типов, которые ведут себя так же, как
целочисленные типы
, как определено
ниже
. Целочисленно-подобный тип не обязательно является
классом
.
Целочисленный тип может представлять
2
N
последовательных целых чисел, где
N
, положительное целое число, называется
шириной
целочисленного типа.
Целочисленный тип класса может быть знаковым или беззнаковым:
-
Знаковый целочисленный классовый тип
может представлять все целые числа в диапазоне
[-2 N-1
,2 N-1
-1], где N больше ширины каждого знакового целочисленного типа. -
Беззнаковый целочисленный классовый тип
может представлять все целые числа в диапазоне
[0,2 N
-1], где N больше ширины каждого беззнакового целочисленного типа.
Все целочисленные типы моделируют
regular
и
three_way_comparable
<
std::
strong_ordering
>
.
Объект целочисленного класса, инициализированный значением по умолчанию , имеет значение 0 .
Выражение
E
целочисленного типа
T
является
контекстно преобразуемым
к
bool
как если бы
bool
(
E
!
=
T
(
0
)
)
.
Целочисленно-подобный тип
Тип, отличный от (возможно, с квалификаторами cv)
bool
, является
целочисленноподобным
, если он моделирует
integral
или если он является целочисленным классовым типом.
-
Целочисленный тип является
знаковым целочисленным
если он моделирует
signed_integralили если он является знаковым целочисленным классом. -
Целочисленный тип является
беззнаковым целочисленным
если он моделирует
unsigned_integralили если он является беззнаковым целочисленным классом.
Обязательные поведения
Выражения целочисленного класса явно преобразуемы в любой целочисленный тип и неявно преобразуемы в любой целочисленный класс равной или большей ширины с той же знаковостью. Выражения целочисленного типа как неявно, так и явно преобразуемы в любой целочисленный класс. Преобразования между целочисленными и целочисленными классами и между двумя целочисленными классами не завершаются исключением. Результатом такого преобразования является уникальное значение целевого типа, которое конгруэнтно исходному по модулю
2
N
, где
N
является шириной целевого типа.
Пусть
Int<T>
обозначает следующий тип:
-
Если
Tявляется типом класса целых чисел,Int<T>представляет собой уникальный гипотетический расширенный целочисленный тип с той же знаковостью и той же шириной, что иT. -
Если
Tявляется целочисленным типом, тоInt<T>является тем же типом, что иT.
Даны следующие типы, значения и операторы:
| Тип | Определение |
IC
|
тип целочисленного класса |
IL
|
целочисленно-подобный тип |
| Значение | Определение |
| a |
объект типа
IC
|
| b |
объект типа
IL
|
| c | lvalue целочисленного типа |
| x |
объект типа
Int<IC>
представляющий то же значение, что и
a
|
| y |
объект типа
Int<IL>
представляющий то же значение, что и
b
|
| Оператор | Определение |
| @ = | один из + = , - = , * = , / = , % = , & = , | = , ^ = , <<= и >>= |
| @ | один из + , - , * , / , % , & , | , ^ , << , >> , && , || , == , ! = , < , > , <= , >= , <=> и , |
Следующие выражения должны быть корректными и иметь указанный результат и эффекты при выполнении указанных условий:
| Выражение | Условие | Результат | Эффекты |
|---|---|---|---|
| a ++ | Нет условия |
a prvalue типа
IC
со значением, равным значению
a
до вычисления
|
изменяет значение a путём добавления 1 к нему |
| a -- | изменяет значение a путем вычитания 1 из него | ||
| ++ a | эквивалентно выражению a + = 1 | ||
| -- a | эквивалентно выражению a - = 1 | ||
| & a | выражение-эквивалент std:: addressof ( a ) | ||
| ! a | ! x корректно сформировано | то же самое, что ! x | |
| + a | + x является корректным выражением |
то же, что и
+
x
, но имеет тип
IC
|
то же, что и + x |
| - a | - x является корректным выражением |
то же, что
-
x
, но имеет тип
IC
|
то же, что - x |
| ~a | ~x является корректным выражением |
то же, что
~x
, но имеет тип
IC
|
то же, что ~x |
| c @ = a | c @ = x корректно сформировано | lvalue, ссылающийся на c | то же самое, что c @ = x |
| a @ = b | x @ = y является корректным выражением | lvalue-ссылка на a | аналогично x @ = y , за исключением того, что значение, которое должно быть записано в x , записывается в a |
| a @ b | x @ y корректно сформировано |
то же, что
x @ y
, но тип результата отличается:
|
то же, что x @ y |
| b @ a | y @ x является корректным выражением |
то же, что и
y @ x
, но тип результата отличается:
|
то же, что и y @ x |
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
|
LWG 3366
( P2393R1 ) |
C++20 |
преобразование между integer-class типом и соответствующим
целочисленным типом не гарантировало получение представимого значения |
гарантировано |
|
LWG 3376
( P2393R1 ) |
C++20 | integer-class типы могли быть только классами |
также разрешены
неклассовые типы |
| LWG 3467 | C++20 | bool считался integer-like типом | исключен |
|
LWG 3575
( P2393R1 ) |
C++20 | для integer-class типов не гарантировалась three-way-comparable | гарантировано |
Смотрите также
|
(C++20)
|
определяет, что
semiregular
тип может быть инкрементирован с помощью пре- и постинкрементных операторов
(концепт) |