is-integer-like , is-signed-integer-like
来自 cppreference.com
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
是一个整型类型,则令Int<T>
与T
相同。
给出以下类型、值和运算符
类型 | 定义 |
IC
|
一个整数类类型 |
IL
|
一个整数类型 |
值 | 定义 |
a | 类型 IC 的对象 |
b | 类型 IL 的对象 |
c | 整型左值 |
x | 表示与 a 相同值的 Int<IC> 类型对象。 |
y | 表示与 b 相同值的 Int<IL> 类型对象。 |
运算符 | 定义 |
@= | 以下之一:+=、-=、*=、/=、%=、&=、|=、^=、<<= 和 >>= |
@ | 以下之一:+、-、*、/、%、&、|、^、<<、>>、&&、||、==、!=、<、>、<=、>=、<=> 和 , |
如果满足指定的条件,则以下表达式必须格式正确,并具有其指定的返回值和效果。
表达式 | 条件 | 返回值 | 效果 |
---|---|---|---|
a++ | 无条件 | 类型为 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 格式正确。 | 引用 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 相同。 |
[edit] 缺陷报告
以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3366 (P2393R1) |
C++20 | 整数类类型与其相应 整数类型之间的转换不能保证生成可表示的值 |
保证 |
LWG 3376 (P2393R1) |
C++20 | 整数类类型只能是类类型 | 还允许 非类类型 |
LWG 3467 | C++20 | bool 被视为整数类类型 | 排除 |
LWG 3575 (P2393R1) |
C++20 | 整数类类型不能保证是三路可比较的 | 保证 |
[edit] 另请参阅
(C++20) |
指定 semiregular 类型可以使用前置和后置自增运算符进行递增。(概念) |