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

См. также

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

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

Spec-Zone.ru

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