C++ Standard Library
La biblioteca estándar de C++ proporciona una amplia gama de facilidades que son utilizables en C++ estándar.
Contenidos |
Categoría
La 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 concepts describe componentes de biblioteca que los programas C++ pueden usar para realizar validación en tiempo de compilación de argumentos de plantilla y realizar despacho de funciones basado en propiedades de tipos. |
(desde C++20) |
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 metaprogramación describe facilidades para usar en plantillas y durante evaluación constante, incluyendo type traits , integer sequence , (desde C++14) y arithmetic racional . |
(desde 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.
|
La biblioteca de soporte para hilos proporciona componentes para crear y gestionar hilos, incluyendo operaciones atómicas , exclusión mutua , y comunicación entre hilos. |
(desde C++11) |
|
La biblioteca de soporte de ejecución proporciona un marco para gestionar la ejecución asíncrona en recursos de ejecución genéricos. |
(desde C++26) |
Contenido de la biblioteca
La 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
<
y
>
en nombres de header son necesariamente nombres válidos de archivos fuente.
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):
| Encabezados de C++ para funcionalidades de biblioteca C | ||||
|---|---|---|---|---|
| <cassert> | <clocale> | <cstdarg> | <cstring> | |
| <cctype> | <cmath> | <cstddef> | <ctime> | |
| <cerrno> | <csetjmp> | <cstdio> | <cwchar> | |
| <cfloat> | <csignal> | <cstdlib> | <cwctype> | |
| <climits> | ||||
| Encabezados añadidos en C++11 | ||||
| <cfenv> | <cinttypes> | <cstdint> | <cuchar> | |
| Encabezados eliminados | ||||
| <ccomplex> | (desde C++11) (obsoleto en C++17) (eliminado en C++20) | |||
| <ciso646> | (eliminado en C++20) | |||
| <cstdalign> | (desde C++11) (obsoleto en C++17) (eliminado en C++20) | |||
| <cstdbool> | (desde C++11) (obsoleto en C++17) (eliminado en C++20) | |||
| <ctgmath> | (desde C++11) (obsoleto en C++17) (eliminado en C++20) | |||
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 C
La 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.
| Encabezados 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> | ||
| Encabezados añadidos en C++11 | |||
| <complex.h> | <inttypes.h> | <stdbool.h> | <tgmath.h> |
| <fenv.h> | <stdalign.h> | <stdint.h> | <uchar.h> |
| Encabezados añadidos en C++23 | |||
| <stdatomic.h> | |||
| Encabezados añadidos en C++26 | |||
| <stdbit.h> | <stdchkint.h> | ||
Salvo que se indique lo contrario, el contenido de cada cabecera
c
xxx
es el mismo que el de la cabecera correspondiente
xxx
.h
como se especifica en la
biblioteca estándar de C
. Sin embargo, en la biblioteca estándar de C++, las declaraciones (excepto los nombres que están definidos como macros en C) están dentro del ámbito del namespace
std
. No está especificado si estos nombres (incluyendo cualquier sobrecarga añadida) se declaran primero dentro del ámbito del namespace global y luego se inyectan en el namespace
std
mediante
using-declarations
explícitas.
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 biblioteca
Inclusión de encabezados
Las 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.
|
En unidades de módulo , los encabezados solo pueden incluirse en fragmentos de módulo global . |
(since C++20) |
Importación de encabezadosLos encabezados de la biblioteca C++ , o, para una implementación independiente, el subconjunto de dichos encabezados proporcionados por la implementación, se denominan colectivamente como encabezados importables de la biblioteca C++ . Los contenidos de los encabezados importables de la biblioteca C++ se ponen a disposición de una unidad de traducción cuando contiene la declaración de importación apropiada. |
(desde C++20) |
Importación de módulosLa biblioteca estándar de C++ proporciona los siguientes módulos de la biblioteca C++ :
Para cada declaración en la biblioteca estándar, |
(desde C++23) |
Vinculación
Las 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ándar
Garantías
Un encabezado de C++ debe proporcionar declaraciones y definiciones que aparecen en
- el resumen de ese encabezado, o
- el resumen de otro encabezado que parece estar incluido en el resumen de ese encabezado.
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
#if
.
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).
|
Las firmas de funciones de la biblioteca estándar solo pueden declararse como constexpr si se requiere que sean constexpr (libstdc++ cmath es notablemente no conforme aquí). Si un encabezado proporciona declaraciones no definitorias de funciones constexpr o constructores, las definiciones correspondientes también deben proporcionarse dentro de ese encabezado. A menos que se especifique lo contrario, cada función de la biblioteca estándar debe cumplir con cada uno de los siguientes requisitos para prevenir carreras de datos :
|
(desde C++11) |
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++,
- la clase base debe ser virtual si se especifica como virtual ,
- la clase base no puede ser virtual si no se especifica como virtual , y
- a menos que se especifique lo contrario, los tipos con nombres distintos serán tipos distintos.
|
A menos que se especifique lo contrario, todos los tipos especificados en la biblioteca estándar de C++ son tipos no- final . |
(since C++11) |
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 .
|
Si una función en la biblioteca estándar de C++ reporta errores mediante un objeto std::error_code , el miembro category() de ese objeto debe retornar std::system_category() para errores originados del sistema operativo, o una referencia a un objeto std::error_category definido por la implementación para errores originados en otro lugar. Los valores posibles de value() para cada una de estas categorías de error deben estar definidos. Los objetos de tipos definidos en la biblioteca estándar de C++ pueden ser movidos . Las operaciones de movimiento pueden estar especificadas explícitamente o generadas implícitamente. A menos que se especifique lo contrario, dichos objetos movidos serán colocados en un estado válido pero no especificado. Un objeto de un tipo definido en la biblioteca estándar de C++ puede ser asignado por movimiento a sí mismo. A menos que se especifique lo contrario, dicha asignación coloca al objeto en un estado válido pero no especificado. |
(desde C++11) |
Libertad de implementación
No 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:
- agregar parámetros con argumentos predeterminados,
- reemplazar una función miembro con argumentos predeterminados con dos o más funciones miembro con comportamiento equivalente, o
- agregar firmas adicionales para un nombre de función miembro.
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.
|
Las implementaciones de la biblioteca estándar de C++ pueden compartir sus propios objetos internos entre hilos si los objetos no son visibles para los usuarios y están protegidos contra carreras de datos. |
(since C++11) |
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.
Fortalecimiento de la biblioteca estándarUna implementación puede ser una implementación reforzada , si la implementación está reforzada está definido por la implementación. Algunas funciones miembro de la biblioteca estándar (y plantillas de funciones miembro) tienen precondiciones reforzadas . Cuando se invoca dicha función:
Funciones miembro con precondiciones reforzadas
|
(desde C++26) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Notas
libstdc++ , libc++ , y STL admiten el uso de módulos de la biblioteca estándar en modo C++20.
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 1 | C++98 |
los enlaces de lenguaje de los nombres de
la biblioteca estándar de C no estaban especificados |
son definidos por la
implementación |
| LWG 119 | C++98 |
las especificaciones de excepción de funciones
virtuales podían fortalecerse |
solo permitido para
funciones no virtuales |
| LWG 147 | C++98 |
la especificación de funciones no miembro
solo consideraba funciones globales |
también considera
funciones no globales |
| LWG 225 | C++98 |
las funciones de la biblioteca estándar podían llamar a funciones no miembro
de otros espacios de nombres debido a la búsqueda dependiente de argumento |
prohibido a menos que
se especifique lo contrario |
| LWG 336 | C++98 | <strstream> no era un encabezado de biblioteca de C++ | es un encabezado de biblioteca de C++ |
| LWG 343 | C++98 | las dependencias de encabezados de biblioteca no estaban especificadas | especificadas (listadas en sinopsis) |
| LWG 456 | C++98 |
los encabezados de C++ para facilidades de biblioteca C podían
solo proporcionar definiciones en el espacio de nombres std |
permitido definir en el espacio de nombres global
y luego inyectar en el espacio de nombres std |
| LWG 465 | C++98 |
identificadores que son palabras clave u operadores en C++ podían
definirse como macros en encabezados de biblioteca estándar de C++ (solo <ciso646> está obligado a no definirlos como macros) |
todos los encabezados de biblioteca
estándar de C++ no pueden definirlos como macros |
| LWG 1178 | C++98 |
los encabezados de C++ deben incluir un encabezado de C++
que contenga cualquier definición necesaria |
los encabezados de C++ deben proporcionar declaraciones
y definiciones que estén directa o indirectamente incluidas en su sinopsis |
| LWG 2013 | C++11 |
no estaba especificado si las funciones no
requeridas por el estándar para ser constexpr pueden declararse constexpr por la biblioteca estándar |
prohibido |
| LWG 2225 | C++98 |
se requería un diagnóstico si un encabezado
se incluía en una posición incorrecta |
no se requiere diagnóstico
en este caso |