Namespaces
Variants

std::numeric_limits<T>:: traps

From cppreference.net
Utilities library
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 было неясно, что возвращается, если перехват
включен или отключен во время выполнения
возвращает статус включения
на момент запуска программы

Смотрите также

Среда с плавающей запятой
идентифицирует типы с плавающей запятой, которые обнаруживают малость до округления
(публичная статическая константа-член)
идентифицирует типы с плавающей запятой, которые обнаруживают потерю точности как потерю денормализации, а не как неточный результат
(публичная статическая константа-член)