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 |
|---|---|
| /* non-specialized */ |
false |
| bool |
false |
| char | обычно true |
| signedchar | обычно true |
| unsignedchar | обычно true |
| wchar_t | обычно true |
| char8_t (начиная с C++20) | обычно true |
| char16_t (начиная с C++11) | обычно true |
| char32_t (начиная с C++11) | обычно true |
| short | обычно true |
| unsignedshort | обычно true |
| int | обычно true |
| unsignedint | обычно true |
| long | обычно true |
| unsignedlong | обычно true |
| longlong (начиная с C++11) | обычно true |
| unsignedlonglong (начиная с C++11) | обычно true |
| float | обычно false |
| double | обычно false |
| longdouble | обычно 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++.
| Отчёт об ошибке | Применён к | Поведение согласно опубликованному стандарту | Правильное поведение |
|---|---|---|---|
| LWG 497 | C++98 | не было ясно, что возвращается, если перехват включается или отключается во время выполнения | возвращается состояние включения на момент запуска программы |
См. также
| Окружение операций с плавающей точкой | |
|
[статический] | определяет типы с плавающей точкой, в которых обнаруживается потеря значимости до округления (общедоступная статическая константа-член) |
|
[статический] | определяет типы с плавающей точкой, в которых потеря точности обнаруживается как потеря при денормализации, а не как неточный результат (общедоступная статическая константа-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/numeric_limits/traps