std::numeric_limits<T>::is_modulo

来自cppreference.com
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(C++17)
(C++17)
栈踪
 
类型支持
基本类型
基础类型
定宽整数类型 (C++11)
数值极限
C 数值极限接口
运行时类型信息
类型特性
类型类别
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20 前)
(C++11)(C++20 中弃用)
(C++11)
类型特性常量
元函数
(C++17)
常量求值语境
受支持操作
关系与属性查询
类型修改
(C++11)(C++11)(C++11)
类型变换
(C++11)
(C++11)
(C++17)
(C++11)(C++20 前)(C++17)
 
 
static const bool is_modulo;
(C++11 前)
static constexpr bool is_modulo;
(C++11 起)

std::numeric_limits<T>::is_modulo 对所有可能 (C++11 前)以模算术处理溢出的算术类型 Ttrue 。模算术即若此类型的加法、减法、乘法或除法结果会落在范围 [min(), max()] 外,则这种运算返回的结果与期望值相差 max()-min()+1 的整数倍。

is_modulo 对有符号整数类型为 false ,除非实现定义有符号整数溢出为回绕。

(C++11 起)

标准特化

T std::numeric_limits<T>::is_modulo 的值
/* non-specialized */ false
bool false
char 实现定义
signed char 实现定义
unsigned char true
wchar_t 实现定义
char8_t (C++20) true
char16_t (C++11) true
char32_t (C++11) true
short 实现定义
unsigned short true
int 实现定义
unsigned int true
long 实现定义
unsigned long true
long long (C++11) 实现定义
unsigned long long (C++11) true
float false
double false
long double false

注解

尽管 C++11 标准仍然说“在大多数机器上,这对于有符号整数为 true ”,这是缺陷而且已被更正。准确措辞从 C++03 到 C++11 的更改使得 true 值不再与有符号整数溢出上的未定义行为兼容。因此,依赖于有符号溢出为未定义(为了优化机会)的实现现在对有符号整数设置 is_modulofalse 。见示例 GCC PR 22200

示例

演示模类型的行为

#include <iostream>
#include <type_traits>
#include <limits>
 
template<class T>
typename std::enable_if<std::numeric_limits<T>::is_modulo>::type
    check_overflow()
{
    std::cout << "\nmax value is " << std::numeric_limits<T>::max() << '\n'
              << "min value is " << std::numeric_limits<T>::min() << '\n'
              << "max value + 1 is " << std::numeric_limits<T>::max()+1 << '\n';
}
 
int main()
{
    check_overflow<int>();
    check_overflow<unsigned long>();
    // check_overflow<float>(); // 编译时错误,非模类型
}

可能的输出:

max value is 2147483647
min value is -2147483648
max value + 1 is -2147483648
 
max value is 18446744073709551615
min value is 0
max value + 1 is 0

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 2422 C++11 曾在大多数机器上要求 is_modulo 对有符号整数类型为 true 对有符号整数类型要求为 false
除非定义有符号整数溢出为回绕

参阅

[静态]
鉴别整数类型
(公开静态成员常量)
[静态]
鉴别 IEC 559/IEEE 754 浮点类型
(公开静态成员常量)
[静态]
鉴别准确表示的类型
(公开静态成员常量)