Spec-Zone.ru › C++

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 не было ясно, что возвращается, если обработка исключений включена или выключена во время выполнения возвращает состояние включения
в начале программы

См. также

Окружение с плавающей точкой
tinyness_before
[static]
определяет типы с плавающей точкой, которые обнаруживают малозначимость перед округлением
(постоянная статический публичный член)
has_denorm_loss
[static]
определяет типы с плавающей точкой, которые обнаруживают потерю точности как потерю при нормализации, а не как неточное значение
(постоянная статический публичный член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/numeric_limits/traps

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API