C++ Standard Library
La bibliothèque standard C++ fournit un large éventail de fonctionnalités utilisables en C++ standard.
Table des matières |
Catégorie
La bibliothèque de support du langage fournit des composants requis par certaines parties du langage C++, tels que l'allocation mémoire ( new / delete ) et le traitement des exceptions .
|
La bibliothèque de concepts décrit les composants de bibliothèque que les programmes C++ peuvent utiliser pour effectuer la validation à la compilation des arguments de template et réaliser la dispatch de fonction basé sur les propriétés des types. |
(depuis C++20) |
La bibliothèque de diagnostic fournit un cadre cohérent pour signaler les erreurs dans un programme C++, incluant des classes d'exception prédéfinies .
La bibliothèque de gestion de la mémoire fournit des composants pour la gestion de la mémoire, incluant les pointeurs intelligents et l'allocateur délimité (depuis C++11) .
|
La bibliothèque de métaprogrammation décrit les fonctionnalités utilisables dans les templates et durant l'évaluation constante, incluant les type traits , integer sequence , (depuis C++14) et l' arithmétique rationnelle . |
(depuis C++11) |
La bibliothèque d'utilitaires généraux inclut des composants utilisés par d'autres éléments de la bibliothèque, tels qu'un allocateur de stockage prédéfini pour la gestion dynamique du stockage, et des composants utilisés comme infrastructure dans les programmes C++, tels que les tuples et (depuis C++11) enveloppes de fonction .
Les conteneurs , itérateurs , ranges (depuis C++20) , et les bibliothèques d' algorithmes fournissent à un programme C++ un accès à un sous-ensemble des algorithmes et structures de données les plus utilisés.
La bibliothèque de chaînes fournit le support pour manipuler du texte représenté comme des séquences homogènes des types suivants : char , char8_t (depuis C++20) , char16_t , char32_t (depuis C++11) , wchar_t , et tout autre type similaire à un caractère.
La bibliothèque de traitement de texte fournit la correspondance et la recherche d'expressions régulières (depuis C++11) , des utilitaires pour le formatage de texte (depuis C++20) , l'identification des encodages de texte (depuis C++26) et les fonctionnalités de localisation .
La bibliothèque numérique fournit des algorithmes numériques et des composants de nombres complexes qui étendent le support pour le traitement numérique. Le composant valarray offre un support pour le traitement par lots, potentiellement implémenté comme des opérations parallèles sur les plateformes qui prennent en charge ce type de traitement. Le composant génération de nombres aléatoires fournit des fonctionnalités pour générer des nombres pseudo-aléatoires. (depuis C++11)
La bibliothèque de temps fournit des utilitaires temporels généralement utiles.
La bibliothèque d'entrée/sortie fournit les composants iostream qui sont le mécanisme principal pour l'entrée et la sortie des programmes C++. Ils peuvent être utilisés avec d'autres éléments de la bibliothèque, en particulier les chaînes, les locales et les itérateurs.
|
La bibliothèque de support des threads fournit des composants pour créer et gérer des threads, incluant les opérations atomiques , l'exclusion mutuelle , et la communication inter-threads. |
(depuis C++11) |
|
La bibliothèque de support d'exécution fournit un cadre pour la gestion de l'exécution asynchrone sur des ressources d'exécution génériques. |
(depuis C++26) |
Contenu de la bibliothèque
La bibliothèque standard C++ fournit les définitions pour les entités et macros décrites dans les synopsis des en-têtes de la bibliothèque standard C++ , sauf indication contraire.
Toutes les entités de la bibliothèque, à l'exception de operator new et operator delete , sont définies dans l'espace de noms std ou dans des espaces de noms imbriqués dans l'espace de noms std (à l'exception des entités pour les fonctionnalités de la bibliothèque standard C, voir ci-dessous). Il n'est pas spécifié si les noms déclarés dans un espace de noms spécifique sont déclarés directement dans cet espace de noms ou dans un espace de noms inline à l'intérieur de cet espace de noms. (depuis C++11)
En-têtes
Chaque élément de la bibliothèque standard C++ est déclaré ou défini (selon le cas) dans un
en-tête
. Un en-tête n'est pas nécessairement un fichier source, et les séquences délimitées par
<
et
>
dans les noms d'en-tête ne sont pas nécessairement des noms de fichiers sources valides.
La bibliothèque standard C++ fournit les en-têtes de bibliothèque C++ et en-têtes C++ supplémentaires pour les fonctionnalités de la bibliothèque C (voir la page « headers » pour les descriptions) :
| En-têtes de bibliothèque C++ | ||||
|---|---|---|---|---|
| <algorithm> | <iomanip> | <list> | <ostream> | <streambuf> |
| <bitset> | <ios> | <locale> | <queue> | <string> |
| <complex> | <iosfwd> | <map> | <set> | <typeinfo> |
| <deque> | <iostream> | <memory> | <sstream> | <utility> |
| <exception> | <istream> | <new> | <stack> | <valarray> |
| <fstream> | <iterator> | <numeric> | <stdexcept> | <vector> |
| <functional> | <limits> | |||
| En-têtes ajoutés en C++11 | ||||
| <array> | <condition_variable> | <mutex> | <scoped_allocator> | <type_traits> |
| <atomic> | <forward_list> | <random> | <system_error> | <typeindex> |
| <chrono> | <future> | <ratio> | <thread> | <unordered_map> |
| <codecvt> | <initializer_list> | <regex> | <tuple> | <unordered_set> |
| En-têtes ajoutés en C++14 | ||||
| <shared_mutex> | ||||
| En-têtes ajoutés en C++17 | ||||
| <any> | <execution> | <memory_resource> | <string_view> | <variant> |
| <charconv> | <filesystem> | <optional> | ||
| En-têtes ajoutés en C++20 | ||||
| <barrier> | <concepts> | <latch> | <semaphore> | <stop_token> |
| <bit> | <coroutine> | <numbers> | <source_location> | <syncstream> |
| <compare> | <format> | <ranges> | <span> | <version> |
| En-têtes ajoutés en C++23 | ||||
| <expected> | <flat_set> | <mdspan> | <spanstream> | <stdfloat> |
| <flat_map> | <generator> | <print> | <stacktrace> | |
| En-têtes ajoutés en C++26 | ||||
| <contracts> | <hazard_pointer> | <inplace_vector> | <rcu> | <text_encoding> |
| <debugging> | <hive> | <linalg> | <simd> | |
| En-têtes supprimés | ||||
| <codecvt> | (depuis C++11) (obsolète en C++17) (supprimé en C++26) | |||
| <strstream> | (obsolète en C++98) (supprimé en C++26) | |||
| En-têtes C++ pour les fonctionnalités de la bibliothèque C | ||||
|---|---|---|---|---|
| <cassert> | <clocale> | <cstdarg> | <cstring> | |
| <cctype> | <cmath> | <cstddef> | <ctime> | |
| <cerrno> | <csetjmp> | <cstdio> | <cwchar> | |
| <cfloat> | <csignal> | <cstdlib> | <cwctype> | |
| <climits> | ||||
| En-têtes ajoutés en C++11 | ||||
| <cfenv> | <cinttypes> | <cstdint> | <cuchar> | |
| En-têtes supprimés | ||||
| <ccomplex> | (depuis C++11) (obsolète en C++17) (supprimé en C++20) | |||
| <ciso646> | (supprimé en C++20) | |||
| <cstdalign> | (depuis C++11) (obsolète en C++17) (supprimé en C++20) | |||
| <cstdbool> | (depuis C++11) (obsolète en C++17) (supprimé en C++20) | |||
| <ctgmath> | (depuis C++11) (obsolète en C++17) (supprimé en C++20) | |||
Une implémentation autonome possède un ensemble d'en-têtes défini par l'implémentation, consultez ici pour les exigences minimales concernant l'ensemble des en-têtes.
Bibliothèque standard C
La bibliothèque standard C++ met également à disposition les fonctionnalités de la bibliothèque standard C, adaptées de manière appropriée pour garantir la sécurité des types statiques. Les descriptions de nombreuses fonctions de bibliothèque s'appuient sur la bibliothèque standard C pour la sémantique de ces fonctions.
Dans certains cas, les signatures spécifiées dans le C++ standard peuvent différer des signatures de la bibliothèque standard C, et des surcharges supplémentaires peuvent être déclarées, mais le comportement et les préconditions (y compris celles impliquées par le restrict du C) (depuis C++17) sont identiques sauf indication contraire.
Pour la compatibilité avec la bibliothèque standard C, la bibliothèque standard C++ fournit les en-têtes C listés ci-dessous. L'utilisation prévue de ces en-têtes est uniquement pour l'interopérabilité. Il est possible que les fichiers source C++ aient besoin d'inclure l'un de ces en-têtes pour être valides selon la norme ISO C. Les fichiers source qui ne sont pas destinés à être également valides selon la norme ISO C ne devraient pas utiliser ces en-têtes C. Voir ici pour les descriptions.
| En-têtes C | |||
|---|---|---|---|
| <assert.h> | <limits.h> | <stdarg.h> | <string.h> |
| <ctype.h> | <locale.h> | <stddef.h> | <time.h> |
| <errno.h> | <math.h> | <stdio.h> | <wchar.h> |
| <float.h> | <setjmp.h> | <stdlib.h> | <wctype.h> |
| <iso646.h> | <signal.h> | ||
| En-têtes ajoutés en C++11 | |||
| <complex.h> | <inttypes.h> | <stdbool.h> | <tgmath.h> |
| <fenv.h> | <stdalign.h> | <stdint.h> | <uchar.h> |
| En-têtes ajoutés en C++23 | |||
| <stdatomic.h> | |||
| En-têtes ajoutés en C++26 | |||
| <stdbit.h> | <stdchkint.h> | ||
Sauf indication contraire, le contenu de chaque en-tête
c
xxx
est identique à celui de l'en-tête correspondant
xxx
.h
tel que spécifié dans la
bibliothèque standard C
. Dans la bibliothèque standard C++, cependant, les déclarations (à l'exception des noms définis comme macros en C) se trouvent dans la portée de l'espace de noms
std
. Il n'est pas spécifié si ces noms (y compris les surcharges ajoutées) sont d'abord déclarés dans la portée de l'espace de noms global puis injectés dans l'espace de noms
std
par des
using-declarations
explicites.
Les noms qui sont définis comme des macros en C ( assert , offsetof , setjmp , va_arg , va_end et va_start ) doivent être définis comme des macros dans la bibliothèque standard C++, même si C autorise leur implémentation en tant que fonctions.
Les noms qui sont définis comme fonctions en C doivent être définis comme fonctions dans la bibliothèque standard C++. Cela interdit la pratique, autorisée en C, de fournir une macro de masquage en plus du prototype de fonction. La seule façon d'obtenir un comportement inline équivalent en C++ est de fournir une définition comme une fonction inline extern .
Les identifiants qui sont des mots-clés ou des opérateurs en C++ ne peuvent pas être définis comme des macros dans les en-têtes de la bibliothèque standard C++. En particulier, l'inclusion de l'en-tête standard <iso646.h> n'a aucun effet.
Noms associés aux fonctions sûres dans le C standard (depuis C++17)
Si un en-tête C++ est inclus, il est défini par l'implémentation si l'un des noms suivants de l'Annexe K standard C est déclaré dans l'espace de noms global (aucun d'entre eux n'est déclaré dans l'espace de noms std ):
Utilisation de la bibliothèque
Inclusion des en-têtes
Les entités de la bibliothèque standard C++ sont définies dans des en-têtes, dont le contenu est mis à disposition d'une unité de traduction lorsqu'elle contient la directive de préprocesseur appropriée #include .
Une unité de traduction peut inclure les en-têtes de bibliothèque dans n'importe quel ordre. Chacun peut être inclus plus d'une fois, sans effet différent de son inclusion exactement une fois, sauf que l'effet de l'inclusion de <cassert> ou <assert.h> dépend à chaque fois de la définition lexicalement courante de NDEBUG .
Une unité de traduction ne peut inclure un en-tête qu'en dehors de toute déclaration ou définition, et lexicalement avant la première référence dans cette unité de traduction à l'une des entités déclarées dans cet en-tête. Aucun diagnostic n'est requis.
|
Dans les unités de module , les en-têtes ne peuvent être inclus que dans les fragments de module global . |
(depuis C++20) |
Importation des en-têtesLes en-têtes de la bibliothèque C++ , ou, pour une implémentation autonome, le sous-ensemble de ces en-têtes fournis par l'implémentation, sont collectivement appelés en-têtes de bibliothèque C++ importables . Le contenu des en-têtes de bibliothèque C++ importables est mis à disposition d'une unité de traduction lorsqu'elle contient la déclaration d'importation appropriée. |
(depuis C++20) |
Importation des modulesLa bibliothèque standard C++ fournit les modules de bibliothèque C++ suivants :
Pour chaque déclaration dans la bibliothèque standard, |
(depuis C++23) |
Liaison
Les entités de la bibliothèque standard C++ possèdent une durée de stockage#lien externe . Sauf indication contraire, les objets et fonctions ont par défaut un extern "C++" lien .
Le fait qu'un nom de la bibliothèque standard C déclaré avec une liaison externe ait une liaison extern "C" ou extern "C++" est défini par l'implémentation. La norme C++ recommande d'utiliser extern "C++" dans ce cas.
Les objets et fonctions définis dans la bibliothèque et requis par un programme C++ sont inclus dans le programme avant le démarrage du programme.
Exigences pour les implémentations de la bibliothèque standard
Garanties
Un en-tête C++ doit fournir les déclarations et les définitions qui apparaissent dans
- le synopsis de cet en-tête, ou
- le synopsis d'un autre en-tête qui semble être inclus dans le synopsis de cet en-tête.
Pour les types et macros définis dans plusieurs en-têtes (tels que NULL ), inclure n'importe quel nombre de ces en-têtes dans n'importe quel ordre ne viole jamais la règle de définition unique .
Sauf indication contraire, tous les
object-like macros
définis par la bibliothèque standard C qui se développent en
constant expressions
intégrales peuvent être utilisés dans les directives de préprocesseur
#if
.
Appeler une signature de fonction non-membre de la bibliothèque standard résulte toujours en l'appel effectif de cette fonction. Par conséquent, une implémentation conforme de la bibliothèque standard ne peut pas définir de fonctions non-membres supplémentaires qui pourraient être appelées par un programme C++ valide.
Les signatures de fonctions non membres ne sont jamais déclarées avec des arguments par défaut supplémentaires.
Sauf indication contraire, les appels effectués par les fonctions de la bibliothèque standard vers des fonctions non-opérateur et non-membres n'utilisent pas de fonctions d'un autre namespace qui sont trouvées via argument-dependent name lookup .
Pour chaque déclaration friend d'une fonction (template) dans une définition de classe (template), aucune autre déclaration n'est fournie pour cette fonction (template).
|
Les signatures de fonctions de la bibliothèque standard ne peuvent être déclarées comme constexpr que si elles doivent obligatoirement être constexpr (libstdc++ cmath est notablement non conforme sur ce point). Si un en-tête fournit des déclarations non définissantes de fonctions ou constructeurs constexpr, les définitions correspondantes doivent également être fournies dans cet en-tête. Sauf indication contraire, chaque fonction de la bibliothèque standard doit satisfaire à chacune des exigences suivantes pour prévenir les courses aux données :
|
(depuis C++11) |
Pour chaque classe définie dans la bibliothèque standard C++ devant être dérivée d'une autre classe définie dans la bibliothèque standard C++,
- la classe de base doit être virtuelle si elle est spécifiée comme virtual ,
- la classe de base ne peut pas être virtuelle si elle n'est pas spécifiée comme virtual , et
- sauf indication contraire, les types avec des noms distincts doivent être des types distincts.
|
Sauf indication contraire, tous les types spécifiés dans la bibliothèque standard C++ sont des types non- final . |
(depuis C++11) |
Si une fonction définie dans la bibliothèque standard C++ est spécifiée pour lever une exception (dans une situation particulière) d'un type donné, l'exception levée ne peut avoir que ce type ou un type dérivé de ce type afin qu'un gestionnaire d'exception pour le type de base puisse l'intercepter.
Les fonctions de la bibliothèque standard C ne peuvent lever des exceptions que lorsqu'une telle fonction appelle une fonction fournie par le programme qui lève une exception ( qsort() et bsearch() remplissent cette condition).
Les opérations de destructeur définies dans la bibliothèque standard C++ ne lèvent jamais d'exceptions. Chaque destructeur dans la bibliothèque standard C++ se comporte comme s'il avait une spécification d'exception non levante .
|
Si une fonction de la bibliothèque standard C++ signale des erreurs via un objet std::error_code , la fonction membre category() de cet objet doit retourner std::system_category() pour les erreurs provenant du système d'exploitation, ou une référence à un objet std::error_category défini par l'implémentation pour les erreurs provenant d'ailleurs. Les valeurs possibles de value() pour chacune de ces catégories d'erreur doivent être définies. Les objets de types définis dans la bibliothèque standard C++ peuvent être déplacés . Les opérations de déplacement peuvent être spécifiées explicitement ou générées implicitement. Sauf indication contraire, ces objets déplacés seront placés dans un état valide mais non spécifié. Un objet d'un type défini dans la bibliothèque standard C++ peut être affecté par déplacement à lui-même. Sauf indication contraire, une telle affectation place l'objet dans un état valide mais non spécifié. |
(depuis C++11) |
Liberté d'implémentation
Il n'est pas spécifié si des fonctions membres ou non membres de la bibliothèque standard C++ sont définies comme inline .
Pour une fonction membre de la bibliothèque standard C++ non virtuelle , un ensemble différent de signatures de fonctions membres peut être déclaré, à condition que tout appel à cette fonction membre qui sélectionnerait une surcharge parmi l'ensemble de déclarations donné se comporte comme si cette surcharge avait été sélectionnée. Cela permet, par exemple :
- ajouter des paramètres avec des arguments par défaut,
- remplacer une fonction membre avec des arguments par défaut par deux ou plusieurs fonctions membres avec un comportement équivalent, ou
- ajouter des signatures supplémentaires pour un nom de fonction membre.
Sauf indication contraire, il est défini par l'implémentation quelles fonctions de la bibliothèque standard C++ peuvent être réentrées récursivement.
|
Les implémentations de la bibliothèque standard C++ peuvent partager leurs propres objets internes entre les threads si ces objets ne sont pas visibles par les utilisateurs et sont protégés contre les courses de données. |
(depuis C++11) |
Il n'est pas spécifié si une signature de fonction ou une classe de la bibliothèque standard C++ est une amie d'une autre classe de la bibliothèque standard C++.
Les noms et les signatures de fonctions globales décrits ici sont réservés à l'implémentation.
Toute classe de la bibliothèque standard C++ peut être dérivée d'une classe dont le nom est réservé à l'implémentation. Si une classe définie dans la bibliothèque standard C++ doit être dérivée d'autres classes de la bibliothèque standard C++, cette classe peut être dérivée directement de la classe de base requise ou indirectement via une hiérarchie de classes de base dont les noms sont réservés à l'implémentation.
Si une fonction définie dans la bibliothèque standard C++ n'est pas spécifiée pour lever une exception mais ne possède pas de spécification d'exception non levante, l'exception levée est définie par l'implémentation, mais son type devrait être std::exception ou tout type dérivé de std::exception .
La spécification d'exception pour une fonction non virtuelle peut être renforcée en ajoutant une spécification d'exception non levante.
Renforcement de la bibliothèque standardUne implémentation peut être une implémentation renforcée , le fait que l'implémentation soit renforcée est défini par l'implémentation. Certaines fonctions membres de la bibliothèque standard (et modèles de fonctions membres) possèdent des préconditions renforcées . Lorsqu'une telle fonction est appelée :
Fonctions membres avec préconditions renforcées
|
(depuis C++26) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Notes
libstdc++ , libc++ , et STL prennent tous en charge l'utilisation des modules de bibliothèque standard en mode C++20.
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 | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 1 | C++98 |
les liaisons linguistiques des noms de
la bibliothèque standard C n'étaient pas spécifiées |
elles sont
définies par l'implémentation |
| LWG 119 | C++98 |
les spécifications d'exception des fonctions
virtuelles pouvaient être renforcées |
uniquement autorisé pour
les fonctions non virtuelles |
| LWG 147 | C++98 |
la spécification sur les fonctions non membres
ne considérait que les fonctions globales |
prend également en compte
les fonctions non globales |
| LWG 225 | C++98 |
les fonctions de la bibliothèque standard pouvaient appeler des fonctions non membres
d'autres espaces de noms en raison de la recherche dépendante de l'argument |
interdit sauf
spécification contraire |
| LWG 336 | C++98 | <strstream> n'était pas un en-tête de bibliothèque C++ | c'est un en-tête de bibliothèque C++ |
| LWG 343 | C++98 | les dépendances des en-têtes de bibliothèque n'étaient pas spécifiées | spécifiées (listées dans les synopsis) |
| LWG 456 | C++98 |
les en-têtes C++ pour les fonctionnalités de bibliothèque C pouvaient
uniquement fournir des définitions dans l'espace de noms std |
autorisé à définir dans l'espace de noms global
puis injecter dans l'espace de noms std |
| LWG 465 | C++98 |
les identifiants qui sont des mots-clés ou opérateurs en C++ pouvaient
être définis comme macros dans les en-têtes de bibliothèque standard C++ (seul <ciso646> est requis de ne pas les définir comme macros) |
tous les en-têtes de bibliothèque
standard C++ ne peuvent pas les définir comme macros |
| LWG 1178 | C++98 |
les en-têtes C++ doivent inclure un en-tête C++
qui contient toute définition nécessaire |
les en-têtes C++ doivent fournir les déclarations
et définitions qui sont directement ou indirectement incluses dans son synopsis |
| LWG 2013 | C++11 |
il n'était pas spécifié si les fonctions non
requises par la norme à être constexpr peuvent être déclarées constexpr par la bibliothèque standard |
interdit |
| LWG 2225 | C++98 |
un diagnostic était requis si un en-tête
est inclus à une position incorrecte |
aucun diagnostic n'est
requis dans ce cas |