C++ Standard Library
La biblioteca estándar de C++ proporciona una amplia gama de facilidades que son utilizables en C++ estándar.
Contenido
CategoríaLa biblioteca de soporte del lenguaje proporciona componentes que son requeridos por ciertas partes del lenguaje C++, como la asignación de memoria ( new / delete ) y el procesamiento de excepciones .
La biblioteca de diagnóstico proporciona un marco consistente para reportar errores en un programa C++, incluyendo clases de excepción predefinidas . La biblioteca de gestión de memoria proporciona componentes para la gestión de memoria, incluyendo smart pointers y scoped allocator (since C++11) .
La biblioteca de utilidades generales incluye componentes utilizados por otros elementos de la biblioteca, como un asignador de almacenamiento predefinido para la gestión dinámica de almacenamiento, y componentes utilizados como infraestructura en programas C++, como tuples y (since C++11) wrappers de función . Las containers , iterators , ranges (since C++20) , y las bibliotecas de algorithms proporcionan a un programa en C++ acceso a un subconjunto de los algoritmos y estructuras de datos más ampliamente utilizados. La biblioteca de cadenas proporciona soporte para manipular texto representado como secuencias homogéneas de los siguientes tipos: char , char8_t (desde C++20) , char16_t , char32_t (desde C++11) , wchar_t , y cualquier otro tipo similar a caracteres. La biblioteca de procesamiento de texto proporciona coincidencia y búsqueda de expresiones regulares (desde C++11) , utilidades para formateo de texto (desde C++20) , identificación de codificaciones de texto (desde C++26) y facilidades de localización . La biblioteca numérica proporciona algoritmos numéricos y componentes de números complejos que extienden el soporte para procesamiento numérico. El componente valarray proporciona soporte para procesamiento n-a-la-vez, potencialmente implementado como operaciones paralelas en plataformas que admiten dicho procesamiento. El componente de números aleatorios proporciona facilidades para generar números pseudoaleatorios. (desde C++11) La biblioteca de tiempo proporciona utilidades de tiempo generalmente útiles. La biblioteca de entrada/salida proporciona los componentes iostream que son el mecanismo principal para la entrada y salida de programas en C++. Pueden utilizarse con otros elementos de la biblioteca, particularmente con strings, locales e iteradores.
Contenido de la bibliotecaLa biblioteca estándar de C++ proporciona definiciones para las entidades y macros descritas en las sinopsis de los encabezados de la biblioteca estándar de C++ , a menos que se especifique lo contrario. Todas las entidades de la biblioteca excepto operator new y operator delete están definidas dentro del espacio de nombres std o espacios de nombres anidados dentro del espacio de nombres std (excepto las entidades para las facilidades de la biblioteca estándar de C, véase más abajo). No está especificado si los nombres declarados en un espacio de nombres específico se declaran directamente en ese espacio de nombres o en un espacio de nombres en línea dentro de ese espacio de nombres. (desde C++11) Encabezados
Cada elemento de la biblioteca estándar de C++ es declarado o definido (según corresponda) en un
header
. Un header no es necesariamente un archivo fuente, ni las secuencias delimitadas por
La biblioteca estándar de C++ proporciona los encabezados de biblioteca de C++ y encabezados adicionales de C++ para facilidades de biblioteca C (consulte la página " headers " para descripciones):
Una implementación independiente tiene un conjunto definido por la implementación de encabezados, consulte aquí para los requisitos mínimos sobre el conjunto de encabezados. Biblioteca estándar de CLa biblioteca estándar de C++ también pone a disposición las facilidades de la biblioteca estándar de C, adecuadamente ajustadas para garantizar la seguridad de tipos estática. Las descripciones de muchas funciones de biblioteca dependen de la biblioteca estándar de C para la semántica de esas funciones. En algunos casos, las firmas especificadas en C++ estándar pueden diferir de las firmas en la biblioteca estándar de C, y pueden declararse sobrecargas adicionales, pero el comportamiento y las precondiciones (incluyendo aquellas implícitas en C's restrict ) (since C++17) son las mismas a menos que se indique lo contrario. Para compatibilidad con la biblioteca estándar de C, la biblioteca estándar de C++ proporciona los encabezados C enumerados a continuación. El uso previsto de estos encabezados es solo para interoperabilidad. Es posible que los archivos fuente de C++ necesiten incluir uno de estos encabezados para ser ISO C válido. Los archivos fuente que no están destinados a ser también ISO C válido no deben usar ninguno de los encabezados C. Consulte aquí para las descripciones.
Salvo que se indique lo contrario, el contenido de cada cabecera
Los nombres que están definidos como macros en C ( assert , offsetof , setjmp , va_arg , va_end y va_start ) deben definirse como macros en la biblioteca estándar de C++, incluso si C otorga licencia para implementarlos como funciones. Los nombres que están definidos como funciones en C deben definirse como funciones en la biblioteca estándar de C++. Esto prohíbe la práctica, permitida en C, de proporcionar una macro de enmascaramiento además del prototipo de función. La única forma de lograr un comportamiento inline equivalente en C++ es proporcionar una definición como una función inline externa . Los identificadores que son palabras clave u operadores en C++ no pueden definirse como macros en los encabezados de la biblioteca estándar de C++. En particular, incluir el encabezado estándar <iso646.h> no tiene ningún efecto. Nombres asociados con funciones seguras en C estándar (since C++17)Si se incluye cualquier cabecera de C++, está definido por la implementación si alguno de los siguientes nombres del Anexo K estándar de C se declara en el espacio de nombres global (ninguno de ellos se declara en el espacio de nombres std ): Uso de la bibliotecaInclusión de encabezadosLas entidades en la biblioteca estándar de C++ se definen en encabezados, cuyos contenidos se ponen a disposición de una unidad de traducción cuando contiene la directiva de preprocesamiento #include apropiada. Una unidad de traducción puede incluir encabezados de biblioteca en cualquier orden. Cada uno puede ser incluido más de una vez, sin efecto diferente a ser incluido exactamente una vez, excepto que el efecto de incluir ya sea <cassert> o <assert.h> depende cada vez de la definición léxicamente actual de NDEBUG . Una unidad de traducción solo puede incluir un encabezado fuera de cualquier declaración o definición, y léxicamente antes de la primera referencia en esa unidad de traducción a cualquiera de las entidades declaradas en ese encabezado. No se requiere diagnóstico.
VinculaciónLas entidades en la biblioteca estándar de C++ tienen duración de almacenamiento#enlace externo . A menos que se especifique lo contrario, los objetos y funciones tienen el extern "C++" enlace predeterminado. Si un nombre de la biblioteca estándar de C declarado con vinculación externa tiene extern "C" o extern "C++" vinculación está definido por la implementación. El estándar de C++ recomienda usar extern "C++" en este caso. Los objetos y funciones definidos en la biblioteca y requeridos por un programa C++ se incluyen en el programa antes del inicio del programa. Requisitos para las implementaciones de la biblioteca estándarGarantíasUn encabezado de C++ debe proporcionar declaraciones y definiciones que aparecen en
Para tipos y macros definidos en múltiples cabeceras (como NULL ), incluir cualquier número de estas cabeceras en cualquier orden nunca viola la regla de una definición .
A menos que se especifique lo contrario, todas las
object-like macros
definidas por la biblioteca estándar de C que se expanden a
constant expressions
integrales pueden utilizarse en directivas de preprocesamiento
Llamar a una firma de función no miembro de la biblioteca estándar siempre resulta en llamar realmente a esa función. Por lo tanto, una implementación conforme de la biblioteca estándar no puede definir funciones no miembro adicionales que puedan ser llamadas por un programa C++ válido. Las firmas de funciones no miembro nunca se declaran con argumentos predeterminados adicionales. A menos que se especifique lo contrario, las llamadas realizadas por funciones en la biblioteca estándar a funciones no operador y no miembro no utilizan funciones de otro namespace que se encuentran mediante argument-dependent name lookup . Para cada declaración friend de una función (template) dentro de una definición de clase (template), no se proporciona ninguna otra declaración para esa función (template).
Para cada clase definida en la biblioteca estándar de C++ que debe ser derivada de otra clase definida en la biblioteca estándar de C++,
Si una función definida en la biblioteca estándar de C++ está especificada para lanzar una excepción (en una situación particular) de un tipo dado, la excepción lanzada solo puede tener ese tipo o un tipo derivado de ese tipo para que un manejador de excepciones para el tipo base pueda capturarla. Las funciones de la biblioteca estándar de C solo pueden lanzar excepciones cuando dicha función llama a una función proporcionada por el programa que lanza una excepción ( qsort() y bsearch() cumplen esta condición). Las operaciones de destructor definidas en la biblioteca estándar de C++ nunca lanzan excepciones. Cada destructor en la biblioteca estándar de C++ se comporta como si tuviera una especificación de excepción no lanzadora .
Libertad de implementaciónNo está especificado si cualquier función miembro o no miembro en la biblioteca estándar de C++ está definida como inline . Para una función miembro de la biblioteca estándar de C++ que no sea virtual , se puede declarar un conjunto diferente de firmas de función miembro, siempre que cualquier llamada a esa función miembro que seleccionaría una sobrecarga del conjunto dado de declaraciones se comporte como si esa sobrecarga hubiera sido seleccionada. Esto permite, por ejemplo:
A menos que se especifique lo contrario, está definido por la implementación qué funciones en la biblioteca estándar de C++ pueden ser reentradas recursivamente.
No está especificado si cualquier firma de función o clase en la biblioteca estándar de C++ es amiga de otra clase en la biblioteca estándar de C++. Los nombres y las firmas de funciones globales descritos aquí están reservados para la implementación. Cualquier clase en la biblioteca estándar de C++ puede derivarse de una clase con un nombre reservado para la implementación. Si se requiere que una clase definida en la biblioteca estándar de C++ derive de otras clases en la biblioteca estándar de C++, esa clase puede derivarse directamente de la base requerida o indirectamente a través de una jerarquía de clases base con nombres reservados para la implementación. Si una función definida en la biblioteca estándar de C++ no está especificada para lanzar una excepción pero no tiene una especificación de excepción no lanzadora, la excepción lanzada está definida por la implementación, pero su tipo debe ser std::exception o cualquier tipo derivado de std::exception . La especificación de excepción para una función no virtual puede fortalecerse añadiendo una especificación de excepción no lanzadora.
Notaslibstdc++ , libc++ , y STL admiten el uso de módulos de la biblioteca estándar en modo C++20. EjemploEjecutar este código 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
}
Salida: Hello stdlib!
Informes de defectosLos siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||