std::numeric_limits<T>::is_modulo
Min standard notice:
The value of std::numeric_limits
# Declarations
static const bool is_modulo;
(until C++11)
static constexpr bool is_modulo;
(since C++11)
# Notes
The standard said “On most machines, this is true for signed integers.” before the resolution of LWG issue 2422. See GCC PR 22200 for a related discussion.
# Example
#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 << "max 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>();
std::cout << '\n';
check_overflow<unsigned long>();
// check_overflow<float>(); // compile-time error, not a modulo type
}
# Defect reports
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 612 | C++98 | the definition of “handle overflowswith modulo arithmetic” was poor[1] | provided abetter definition |
| LWG 2422 | C++98 | is_modulo was required to be true forsigned integer types on most machines | required to be false for signed integer typesunless signed integer overflow is defined to wrap |