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 integer-class type 이라 함은, 구현에서 정의하는 타입 집합에 속하며 integer types 와 동일하게 동작하는 타입을 의미합니다. 이는 아래 에 정의된 바와 같습니다. integer-class type이 반드시 class type 인 것은 아닙니다.

정수-클래스 타입은 2 N
개의 연속된 정수를 표현할 수 있으며, 여기서 양의 정수인 N 을 정수-클래스 타입의 너비(width) 라고 합니다.

정수-클래스 타입은 부호 있는(signed) 또는 부호 없는(unsigned) 타입입니다:

  • 부호 있는 정수 클래스 타입 [ -2 N-1
    , 2 N-1
    -1
    ]
    범위의 모든 정수를 표현할 수 있으며, 여기서 N 은 모든 부호 있는 정수형의 너비보다 큰 값입니다.
  • 부호 없는 정수 클래스 타입 [ 0 , 2 N
    -1
    ]
    범위의 모든 정수를 표현할 수 있으며, 여기서 N 은 모든 부호 없는 정수형의 너비보다 큰 값입니다.

모든 정수 클래스 타입은 regular three_way_comparable < std:: strong_ordering > 를 모델링합니다.

정수 클래스 타입의 값 초기화 된 객체는 값 0 을 가집니다.

정수-클래스 타입 T 의 표현식 E bool 문맥적 변환 이 가능하며, 이는 마치 bool ( E ! = T ( 0 ) ) 와 같은 방식으로 수행됩니다.

정수형 유사 타입

(cv 한정자가 있을 수 있는) bool 이외의 타입은 integral 개념을 모델링하거나 integer-class 타입인 경우 정수형 유사(integer-like) 라고 합니다.

  • 정수형 유사 타입은 signed_integral 을 모델로 하거나 부호 있는 정수 클래스 타입인 경우 부호 있는 정수형 유사(signed-integer-like) 입니다.
  • 정수형 유사 타입은 unsigned_integral 을 모델로 하거나 부호 없는 정수 클래스 타입인 경우 부호 없는 정수형 유사(unsigned-integer-like) 입니다.

필수 동작

정수-클래스 타입의 표현식은 명시적으로 모든 정수-유사 타입으로 변환 가능하며, 동일한 부호성을 가지며 동등하거나 더 큰 너비를 가진 모든 정수-클래스 타입으로 암시적으로 변환 가능합니다. 정수 타입의 표현식은 암시적 및 명시적으로 모든 정수-클래스 타입으로 변환 가능합니다. 정수와 정수-클래스 타입 간의 변환 및 두 정수-클래스 타입 간의 변환은 예외를 통해 종료되지 않습니다. 이러한 변환의 결과는 소스 값을 모듈로 2 N
와 합동인 대상 타입의 고유한 값이며, 여기서 N 은 대상 타입의 너비입니다.

다음 타입을 Int<T> 로 표기합니다:

  • 만약 T 가 integer-class 타입이라면, Int<T> T 와 동일한 부호와 동일한 너비를 가진 고유한 가상의 확장 정수 타입 입니다.
  • 만약 T 가 integral 타입이라면, Int<T> T 와 동일한 타입입니다.

주어진 타입, 값 및 연산자:

유형 정의
IC 정수 클래스 유형
IL 정수형 유사 유형
정의
a IC 타입의 객체
b IL 타입의 객체
c 정수형 타입의 lvalue
x a 와 동일한 값을 나타내는 Int<IC> 타입의 객체
y b 와 동일한 값을 나타내는 Int<IL> 타입의 객체
연산자 정의
@ = 다음 중 하나: + = , - = , * = , / = , % = , & = , | = , ^ = , <<= >>=
@ 다음 중 하나: + , - , * , / , % , & , | , ^ , << , >> , && , || , == , ! = , < , > , <= , >= , <=> ,

다음 표현식들은 지정된 조건이 충족될 경우 반드시 올바른 형식이어야 하며 지정된 결과와 효과를 가져야 합니다:

표현식 조건 결과 영향
a ++ 조건 없음 평가 전 a 의 값과 동일한 값을 가지는 IC 타입의 prvalue a 의 값에 1 을 더하여 값을 수정함
a -- a의 값을 a 에서 1 을 빼서 수정합니다
++ a 표현식-동등 to 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 가 올바른 형식임 c 를 참조하는 lvalue c @ = x 와 동일
a @ = b x @ = y 가 올바른 형식임 a 를 참조하는 lvalue 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 적용 대상 게시된 동작 수정된 동작
LWG 3366
( P2393R1 )
C++20 정수-클래스 타입과 해당 정수 타입 간 변환이
표현 가능한 값을 생성한다는 보장이 없었음
보장됨
LWG 3376
( P2393R1 )
C++20 정수-클래스 타입이 클래스 타입만 가능했음 비-클래스 타입도
허용됨
LWG 3467 C++20 bool 가 정수-유사 타입으로 간주됨 제외됨
LWG 3575
( P2393R1 )
C++20 정수-클래스 타입이 삼방 비교 가능하다는 보장이 없었음 보장됨

참고 항목

semiregular 타입이 전위 및 후위 증가 연산자로 증가될 수 있음을 명시
(concept)