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]
|
идентифицирует типы с плавающей запятой, которые обнаруживают потерю точности как потерю денормализации, а не как неточный результат
(публичная статическая константа-член) |