std::numeric_limits<T>:: traps
|
static
const
bool
traps
;
|
(jusqu'à C++11) | |
|
static
constexpr
bool
traps
;
|
(depuis C++11) | |
La valeur de
std::
numeric_limits
<
T
>
::
traps
est
true
pour tous les types arithmétiques
T
qui ont au moins une valeur au début du programme qui, si elle est utilisée comme argument à une opération arithmétique, générera un
trap
.
Table des matières |
Spécialisations standards
T
|
valeur de std:: numeric_limits < T > :: traps |
| /* non-specialized */ | false |
| bool | false |
| char | généralement true |
| signed char | généralement true |
| unsigned char | généralement true |
| wchar_t | généralement true |
| char8_t (depuis C++20) | généralement true |
| char16_t (depuis C++11) | généralement true |
| char32_t (depuis C++11) | généralement true |
| short | généralement true |
| unsigned short | généralement true |
| int | généralement true |
| unsigned int | généralement true |
| long | généralement true |
| unsigned long | généralement true |
| long long (depuis C++11) | généralement true |
| unsigned long long (depuis C++11) | généralement true |
| float | généralement false |
| double | généralement false |
| long double | généralement false |
Notes
Sur la plupart des plateformes, la division entière par zéro génère toujours un piège, et std:: numeric_limits < T > :: traps vaut true pour tous les types entiers qui prennent en charge la valeur 0 . L'exception est le type bool : bien que la division par false génère un piège en raison de la promotion entière de bool vers int , c'est la valeur zéro du int qui génère le piège. Zéro n'est pas une valeur du type bool .
Sur la plupart des plateformes, les exceptions en virgule flottante peuvent être activées et désactivées à l'exécution (par exemple
feenableexcept
(
)
sur Linux ou
_controlfp
sur Windows), auquel cas la valeur de
std::
numeric_limits
<
T
>
::
traps
pour les types en virgule flottante reflète l'état du mécanisme de capture des exceptions en virgule flottante au moment du démarrage du programme, qui est
false
sur la plupart des systèmes modernes. Une exception serait un programme
DEC Alpha
, où il est
true
s'il est compilé sans l'option
-ieee
.
Exemple
#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'; }
Sortie possible :
// Sortie GCC : bool: traps = true char: traps = true char16_t: traps = true long: traps = true float: traps = false // Sortie Clang : bool: traps = false char: traps = true char16_t: traps = true long: traps = true float: traps = false
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 497 | C++98 |
il n'était pas clair ce qui est retourné si le trapping
est activé ou désactivé à l'exécution |
retourne le statut d'activation
au début du programme |
Voir aussi
| Environnement en virgule flottante | |
|
[static]
|
identifie les types en virgule flottante qui détectent la petitesse avant l'arrondi
(constante de membre statique publique) |
|
[static]
|
identifie les types en virgule flottante qui détectent la perte de précision comme une perte de dénormalisation plutôt qu'un résultat inexact
(constante de membre statique publique) |