std::numeric_limits<T>::traps
static const bool traps; | (до C++11) | |
static constexpr bool traps; | (с C++11) |
Значение std::numeric_limits<T>::traps равно true для всех арифметических типов T, которые по крайней мере в начале программы имеют хотя бы одно значение, использование которого в качестве аргумента арифметической операции вызовет исключение.
Стандартные специализации
T | значение std::numeric_limits<T>::traps |
|---|---|
| /* неспециализированный */ | false |
| bool | false |
| char | обычно true |
| signed char | обычно true |
| unsigned char | обычно true |
| wchar_t | обычно true |
| char8_t (с C++20) | обычно true |
| char16_t (с C++11) | обычно true |
| char32_t (с C++11) | обычно true |
| short | обычно true |
| unsigned short | обычно true |
| int | обычно true |
| unsigned int | обычно true |
| long | обычно true |
| unsigned long | обычно true |
| long long (с C++11) | обычно true |
| unsigned long long (с C++11) | обычно true |
| float | обычно false |
| double | обычно false |
| long double | обычно false |
Примечания
На большинстве платформ целочисленное деление на ноль всегда вызывает исключение, и std::numeric_limits<T>::traps равно true для всех целочисленных типов, которые поддерживают значение 0. Исключение составляет тип bool: даже если деление на false вызывает исключение из-за преобразования типа bool в int, это нулевое значение int, которое вызывает исключение. Нуль не является значением типа bool.
На большинстве платформ плавающие точки исключения могут быть включены и выключены во время выполнения (например, feenableexcept() в Linux или _controlfp в Windows), в этом случае значение std::numeric_limits<T>::traps для типов с плавающей точкой отражает состояние механизма обработки исключений с плавающей точкой в момент запуска программы, что обычно false на большинстве современных систем. Исключением является программа для DEC Alpha, где оно равно true, если она скомпилирована без -ieee.
Пример
#include <iostream>
#include <limits>
int main()
{
std::cout << std::boolalpha
<< "bool: traps = " << std::numeric_limits<bool>::traps << '\n'
<< "char: traps = " << std::numeric_limits<char>::traps << '\n'
<< "char16_t: traps = " << std::numeric_limits<char16_t>::traps << '\n'
<< "long: traps = " << std::numeric_limits<long>::traps << '\n'
<< "float: traps = " << std::numeric_limits<float>::traps << '\n';
}Возможный вывод:
// GCC output: bool: traps = true char: traps = true char16_t: traps = true long: traps = true float: traps = false // Clang output: bool: traps = false char: traps = true char16_t: traps = true long: traps = true float: traps = false
Отчёты об ошибках
Следующие отчёты об ошибках, которые изменяют поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 497 | C++98 | не было ясно, что возвращается, если обработка исключений включена или выключена во время выполнения | возвращает состояние включения в начале программы |
См. также
| Окружение с плавающей точкой | |
|
[static] | определяет типы с плавающей точкой, которые обнаруживают малозначимость перед округлением (постоянная статический публичный член) |
|
[static] | определяет типы с плавающей точкой, которые обнаруживают потерю точности как потерю при нормализации, а не как неточное значение (постоянная статический публичный член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/numeric_limits/traps