C++ Standard Library
La bibliothèque standard C++ fournit un large éventail de fonctionnalités utilisables en C++ standard.
Sommaire
CatégorieLa 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 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 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.
Contenu de la bibliothèqueLa 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
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) :
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 CLa 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.
Sauf indication contraire, le contenu de chaque en-tête
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èqueInclusion des en-têtesLes 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.
LiaisonLes 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 standardGarantiesUn en-tête C++ doit fournir les déclarations et les définitions qui apparaissent dans
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
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).
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++,
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 .
Liberté d'implémentationIl 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 :
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.
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.
Noteslibstdc++ , libc++ , et STL prennent tous en charge l'utilisation des modules de bibliothèque standard en mode C++20. ExempleExécuter ce code import std;
struct Str : std::string // OK, std::string cannot be final
{
~Str(); // Guaranteed to be noexcept
};
int main()
{
std::puts("Hello stdlib!");
// ::puts("Hello stdlib!"); // Requires std.compat module or stdio.h header
// constexpr auto& void_info = std::any().type(); // std::any::type cannot be constexpr
std::string t;
t = std::move(t); // OK, t is left in a valid (but unspecified) state
}
Sortie : Hello stdlib!
Rapports de défautsLes rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||