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*/ = /* see description */ ;
(1) (начиная с C++20)
( только для демонстрации* )
template < class T >
constexpr bool /*is-signed-integer-like*/ = /* see description */ ;
(2) (начиная с C++20)
( только для демонстрации* )
1) /*is-integer-like*/ < T > является true тогда и только тогда, когда T является целочисленным типом.
2) /*is-signed-integer-like*/ < T > является true тогда и только тогда, когда 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 имеет тип Int<IC> , результат имеет тип IC .
  • Если x @ y имеет тип Int<IL> , результат имеет тип IL .
  • Если x @ y имеет любой другой тип T , результат имеет тип T .
то же, что x @ y
b @ a y @ x является корректным выражением то же, что и y @ x , но тип результата отличается:
  • Если y @ x имеет тип Int<IC> , результат имеет тип IC .
  • Если y @ x имеет тип Int<IL> , результат имеет тип IL .
  • Если y @ x имеет любой другой тип T , результат имеет тип T .
то же, что и 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 гарантировано

Смотрите также

определяет, что semiregular тип может быть инкрементирован с помощью пре- и постинкрементных операторов
(концепт)