is-integer-like, is-signed-integer-like
来自 cppreference.cn
< cpp | 迭代器 (iterator)
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 的值 |
通过将 1 添加到 a 来修改 a 的值 |
a-- | 通过从 a 中减去 1 来修改 a 的值 | ||
++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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 3366 (P2393R1) |
C++20 | 整数类类型与其对应的整数类型之间的转换 未保证生成可表示值 |
已保证 |
LWG 3376 (P2393R1) |
C++20 | 整数类类型只能是类类型 | 也允许 非类类型 |
LWG 3467 | C++20 | bool 被视为整数类类型 | 已排除 |
LWG 3575 (P2393R1) |
C++20 | 整数类类型未保证是三向可比较的 | 已保证 |
[编辑] 参见
(C++20) |
指定一个semiregular 类型可以使用前置和后置增量运算符进行增量操作(概念) |