is-integer-like , is-signed-integer-like
来自 cppreference.cn
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
是一个带符号类整数类型。目录 |
[编辑] 整数类类型
类型 T
是整数类类型,如果它属于实现定义的类型集合,这些类型的行为如同整数类型一样,定义见下文。整数类类型不一定是类类型。
整数类类型可以表示 2N
个连续整数,其中 N,一个正整数,称为整数类类型的宽度。
整数类类型可以是带符号的或无符号的
- 带符号整数类类型可以表示
[
-2N-1,
2N-1
-1]
中的所有整数,其中 N 大于每个带符号整型类型的宽度。 - 无符号整数类类型可以表示
[
0,
2N
-1]
中的所有整数,其中 N 大于每个无符号整型类型的宽度。
所有整数类类型都模型化 regular
和 three_way_comparable
<std::strong_ordering>。
整数类类型的值初始化对象的值为 0。
整数类类型 T
的表达式 E 可以语境转换为 bool,如同通过 bool(E != T(0))。
[编辑] 类整数类型
除(可能带 cv 限定的)bool 之外的类型,如果它模型化 integral
或它是整数类类型,则为类整数类型。
- 如果类整数类型模型化
signed_integral
或它是带符号整数类类型,则为带符号类整数类型。 - 如果类整数类型模型化
unsigned_integral
或它是无符号整数类类型,则为无符号类整数类型。
[编辑] 必需行为
整数类类型的表达式可以显式转换为任何类整数类型,并隐式转换为任何宽度相等或更大且符号相同的整数类类型。整型类型的表达式可以隐式和显式转换为任何整数类类型。整型和整数类类型之间以及两个整数类类型之间的转换不会通过异常退出。此类转换的结果是目标类型的唯一值,该值与源模 2N
同余,其中 N 是目标类型的宽度。
令 Int<T>
表示以下类型
- 如果
T
是整数类类型,则Int<T>
是唯一的假设扩展整型类型,其符号与T
相同,宽度也与T
相同。 - 如果
T
是整型类型,则令Int<T>
与T
的类型相同。
给定以下类型、值和运算符
类型 | 定义 |
IC
|
整数类类型 |
IL
|
类整数类型 |
值 | 定义 |
a | 类型 IC 的对象 |
b | 类型 IL 的对象 |
c | 整型类型的左值 |
x | 类型 Int<IC> 的对象,表示与 a 相同的值 |
y | 类型 Int<IL> 的对象,表示与 b 相同的值 |
运算符 | 定义 |
@= | 以下之一:+=、-=、*=、/=、%=、&=、|=、^=、<<= 和 >>= |
@ | 以下之一:+、-、*、/、%、&、|、^、<<、>>、&&、||、==、!=、<、>、<=、>=、<=> 和 , |
如果满足指定的条件,则以下表达式必须是良构的,并具有其指定的结果和效果
表达式 | 条件 | 结果 | 效果 |
---|---|---|---|
a++ | 无条件 | 类型为 IC 的 a 右值,其值等于求值前 a 的值 |
通过将 1 加到 a 的值来修改它 |
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 是良构的 | 引用 c 的左值 | 与 c @= x 相同 |
a @= b | x @= y 是良构的 | 引用 a 的左值 | 与 x @= y 相同,只是将要存储到 x 中的值存储到 a 中 |
a @ b | x @ y 是良构的 | 与 x @ y 相同,但结果类型不同
|
与 x @ y 相同 |
b @ a | y @ x 是良构的 | 与 y @ x 相同,但结果类型不同
|
与 y @ x 相同 |
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 3366 (P2393R1) |
C++20 | 整数类类型及其对应的 整型类型之间的转换不能保证产生可表示的值 |
保证 |
LWG 3376 (P2393R1) |
C++20 | 整数类类型只能是类类型 | 也允许 非类类型 |
LWG 3467 | C++20 | bool 被认为是类整数类型 | 排除 |
LWG 3575 (P2393R1) |
C++20 | 不能保证整数类类型是三路可比较的 | 保证 |
[编辑] 参见
(C++20) |
指定 semiregular 类型可以使用前缀和后缀递增运算符递增(概念) |