is-integer-like , is-signed-integer-like

来自cppreference.com
< cpp‎ | iterator


 
 
迭代器库
迭代器概念
is-integer-like
is-signed-integer-like
(C++20)(C++20)
迭代器原语
算法概念与工具
间接可调用概念
常用算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器适配器
范围访问
(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*/ = /* 见描述 */;
(1) (C++20 起)
(仅用于阐述*)
template< class T >
constexpr bool /*is-signed-integer-like*/ = /* 见描述 */;
(2) (C++20 起)
(仅用于阐述*)
1) /*is-integer-like*/<T> 当且仅当 T 是整数式类型时是 true
2) /*is-signed-integer-like*/<T> 当且仅当 T 是有符号整数式类型时是 true

整数类类型

如果类型 T 在某个包含由实现定义的表现为整数类型定义如下)的类型集合中,那么它是整数类类型。整数类类型不一定是类类型

一个整数类类型可以表示 2N
个连续整数,其中正整数 N 被称为该整数类类型的宽度

整数类类型要么是有符号的,要么是无符号的:

  • 有符号整数类类型 可以表示 [-2N-1
    2N-1
    -1
    ] 中的所有整数,其中 N 大于所有有符号整数类型的宽度。
  • 无符号整数类类型 可以表示 [02N
    -1
    ] 中的所有整数,其中 N 大于所有无符号整数类型的宽度。

所有整数类类型都实现了 regularthree_way_comparable<std::strong_ordering>

值初始化的整数类类型对象的值是 0

具有整数类类型 T 的表达式 E 可以如同通过 bool(E != T(0)) 按语境转换bool

整数式类型

除了(可有 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++ 无条件 值与 a 在求值该表达式前的值相等的 IC 类型纯右值 以向其加 1 的方式修改 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 具有 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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3366
(P2393R1)
C++20 整数类类型与它对应的整数类型之间的转换不保证会产生可以表示的值 保证会产生
LWG 3376
(P2393R1)
C++20 整数类类型只能是类类型 可以不是类类型
LWG 3467 C++20 bool 被认为是整数式类型 已排除
LWG 3575
(P2393R1)
C++20 整数类类型不保证能进行三路比较 保证能进行

参阅

指定 semiregular 类型能以前后自增运算符自增
(概念)