名前空間
変種
操作

std::numeric_limits<T>::is_modulo

提供: cppreference.com
 
 
 
型サポート
型の性質
(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未満)すべての算術型に対して true になります。 つまり、その型の加減乗除の結果が範囲 [min(), max()] の外側になった場合、そのような演算の戻り値は期待される値と max()-min()+1 の倍数だけ異なります。

符号付き整数型の場合、処理系が符号付き整数のオーバーフローをラップすると定義しない限り、 is_modulofalse です。

(C++11以上)

目次

[編集] 標準の特殊化

T std::numeric_limits<T>::is_modulo の値
/* 非特殊化 */ false
bool false
char 処理系定義
signed char 処理系定義
unsigned char true
wchar_t 処理系定義
char8_t true
char16_t true
char32_t true
short 処理系定義
unsigned short true
int 処理系定義
unsigned int true
long 処理系定義
unsigned long true
long long 処理系定義
unsigned long long 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>(); // compile-time error, not a modulo type
}

出力例:

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 was required to true
for signed integer types on most machines
required to be false for signed integer types
unless signed integer overflow is defined to wrap

[編集] 関連項目

[静的]
整数型を識別します
(パブリック静的メンバ定数) [edit]
[静的]
IEC 559/IEEE 754 の浮動小数点型を識別します
(パブリック静的メンバ定数) [edit]
[静的]
正確な型を識別します
(パブリック静的メンバ定数) [edit]