Biblioteca estándar de C++
La biblioteca estándar de C++ proporciona una amplia gama de utilidades que se pueden usar en C++ estándar.
Contenido |
[editar] Categoría
La biblioteca de soporte del lenguaje proporciona componentes requeridos por ciertas partes del lenguaje C++, como la asignación de memoria (new/delete) y el procesamiento de excepciones.
La biblioteca de conceptos describe componentes de biblioteca que los programas en C++ pueden usar para realizar la validación en tiempo de compilación de los argumentos de plantilla y realizar la distribución de las funciones según las propiedades de los tipos. |
(desde C++20) |
La biblioteca de diagnóstico proporciona un framework consistente para informar de errores en un programa de C++, incluyendo clases de excepción predefinidas.
La biblioteca de gestión de memoria proporciona componentes para gestionar la memoria, incluyendo punteros inteligentes y asignadores de ámbito (desde C++11).
La biblioteca de metaprogramación describe funciones para su uso en plantillas y durante la evaluación constante, incluyendo rasgos de tipos, secuencia de enteros, (desde C++14) y aritmética racional. |
(desde C++11) |
La biblioteca de utilidades generales incluye componentes usados por otros elementos de biblioteca, como un asignador de almacenamiento predefinido para la gestión de almacenamiento dinámico, y componentes utilizados con infraestructura en programas de C++, como tuplas y (desde C++11) contenedores (wrappers) de funciones.
La biblioteca de cadenas de texto proporciona funciones para la manipulación de texto representadas como secuencias homogéneas de los tipos siguientes: char, char8_t (desde C++20), char16_t, char32_t (desde C++11), wchar_t, y cualquier otro tipo similar a un carácter.
Las bibliotecas de contenedores, iteradores, rangos (desde C++20), y algoritmos proporcionan a un programa C++ acceso un subconjunto de los algoritmos y estructuras de datos más utilizados.
La biblioteca numérica proporciona componentes de algoritmos numéricos y número complejo que extienden el soporte para el procesamiento numérico. El componente valarray brinda soporte para el procesamiento n-at-a-time (varios a un tiempo), potencialmente implementado como operaciones paralelas en plataformas de admiten dicho procesamiento. El componente de números aleatorios proporciona funciones para generar números pseudoaleatorios. (desde C++11)
La biblioteca de tiempo proporciona utilidades de tiempo generalmente útiles.
La biblioteca de localización provee soporte de internacionalización para el procesamiento de texto.
La biblioteca de entrada/salida proporciona los componentes iostream que son el mecanismo principal para la entrada y salida de los programas en C++. Se pueden usar con otros elementos de la biblioteca, en particular cadenas, configuraciones regionales e iteradores.
La biblioteca de expresiones regulares proporciona búsqueda y coincidencia de expresiones regulares. La biblioteca de soporte de subprocesos (hilos) proporciona componentes para crear y administrar subprocesos, incluyendo operaciones atómicas, exclusión mutua, y comunicaciones entre subprocesos. |
(desde C++11) |
[editar] Contenidos 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 indique lo contrario.
Todas las entidades de la biblioteca, excepto el operador new y el operador delete, se definen dentro del espacio de nombres std o en espacios de nombres anidados dentro de std (excepto las entidades de la biblioteca estándar de C, ver más adelante). No se especifica si los nombres declarados en un espacio de nombre 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)
[editar] Cabeceras
Cada elemento de la biblioteca estándar de C++ se declara o define (como sea apropiado) en una cabecera. Un encabezado no es necesariamente un archivo fuente, ni las secuencias delimitadas por < y > en los nombres de encabezado son necesariamente nombres de archivo fuente válidos.
La biblioteca estándar de C++ proporciona cabeceras de biblioteca C++ y encabezados C++ adicionales para las funciones de la biblioteca C (consulte la página 'encabezados' para descripciones):
Cabeceras de C++ para funciones de biblioteca C | ||||
---|---|---|---|---|
<cassert> | <clocale> | <cstdarg> | <cstring> | |
<cctype> | <cmath> | <cstddef> | <ctime> | |
<cerrno> | <csetjmp> | <cstdio> | <cwchar> | |
<cfloat> | <csignal> | <cstdlib> | <cwctype> | |
<climits> | ||||
Cabeceras añadidas en C++11 | ||||
<cfenv> | <cinttypes> | <cstdint> | <cuchar> | |
Cabeceras eliminadas | ||||
<ccomplex> | (desde C++11)(en desuso en C++17)(eliminado en C++20) | |||
<ciso646> | (eliminado en C++20) | |||
<cstdalign> | (desde C++11)(en desuso en C++17)(eliminado en C++20) | |||
<cstdbool> | (desde C++11)(en desuso en C++17)(eliminado en C++20) | |||
<ctgmath> | (desde C++11)(en desuso en C++17)(eliminado en C++20) |
Una implementación independiente tiene un conjunto de cabeceras definidas para la implementación, consulte aquí los requisitos mínimos del conjunto de cabeceras.
[editar] Biblioteca estándar de C
La biblioteca estándar de C++ también pone a disposición las funciones de la biblioteca estándar de C, adecuadamente ajustadas para garantizar la seguridad de tipos estáticos. Las descripciones de muchas funciones de la biblioteca se basan en la biblioteca estándar de C para la semántica de esas funciones.
En algunos casos, las firmas especificadas en C++ estándar pueden ser diferentes de las firmas de la biblioteca estándar de C y se pueden declarar sobrecargas adicionales, pero el comportamiento y las condiciones previas (incluyendo las implícitas por restrict de C) (desde C++17) son los mismos, a menos que se indique lo contrario.
Por compatibilidad con la biblioteca estándar de C, la biblioteca estándar de C++ proporciona las cabeceras de C que se enumeran a continuación. El uso previsto de estas cabeceras es para la interoperabilidad únicamente. Puede ser que los archivos fuente de C++ necesitan incluir una de estas cabeceras para ser C ISO válido. Los archivos fuente que no están destinados a ser válidos C ISO también, no deben usar ninguna cabecera de C. Consulte aquí para aclaraciones.
Cabeceras de 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> | ||
Cabeceras añadidas en C++11 | |||
<complex.h> | <inttypes.h> | <stdbool.h> | <tgmath.h> |
<fenv.h> | <stdalign.h> | <stdint.h> | <uchar.h> |
Cabeceras añadidas en C++23 | |||
<stdatomic.h> |
Salvo que se diga los contrario, el contenido de cada cabecera cxxx
es el mismo que el de la cabecera xxx.h
correspondiente 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 se definen como macros en C) están dentro del ámbito del espacio de nombres std. No está especificado si estos nombres (incluyendo las sobrecargas añadidas) se declaran primero dentro del ámbito del espacio de nombres global y luego se inyectan en el espacio de nombres std mediante declaraciones using explícitas.
Los nombres que se definen en C como macros (assert, offsetof, setjmp, va_arg, va_end y va_start) se deben definir como macros en la biblioteca estándar de C++, incluso si C da licencia para su implementación como funciones.
Los nombres que se definen como funciones de C deben definirse como funciones en la biblioteca estándar de C++. Esto no permite 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 función inline externa.
Los identificadores que son palabras clave u operadores en C++ no se pueden definir como macros en las cabeceras de la biblioteca estándar de C++. En particular, incluir la cabecera estándar <iso646.h> no tiene ningún efecto.
[editar] Nombres asociados con funciones seguras en C estándar (desde C++17)
Si se incluye alguna cabecera de C++, la implementación define si alguno de los siguientes nombres del Anexo K del estándar de C se declara en el espacio de nombres global (ninguna se declara en el espacio de nombres std):
[editar] Usar la biblioteca
[editar] Incluir cabeceras
Las entidades de la biblioteca estándar de C++ se definen en cabeceras, cuyo contenido se pone a disposición de una unidad de traducción cuando contienen la directiva de preprocesamiento #include adecuada.
Una unidad de traducción puede incluir las cabeceras de biblioteca en cualquier orden. Cada una puede incluirse más de una vez, sin ningún efecto diferente al incluirse una vez, excepto que el efecto de incluir <cassert> o <assert.h> depende cada vez de la definición léxica actual de NDEBUG.
Una unidad de traducción sólo puede incluir una cabecera 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 esa cabecera. No se requiere diagnóstico.
En las unidades de módulo, las cabeceras sólo se pueden incluir en fragmentos de módulo globales. |
(desde C++20) |
Importar cabecerasLas cabeceras de la biblioteca de C++ o, para una implementación independiente, el subconjunto de dichas cabeceras proporcionadas por la implementación, se conocen colectivamente como cabeceras de biblioteca de C++ importables. El contenido de las cabeceras de biblioteca de C++ importables es accesible a una unidad de traducción cuando contiene la declaración de importación adecuada. |
(desde C++20) |
Importar módulosLa biblioteca estándar de C++ proporciona los siguientes módulos de biblioteca de C++:
Para cada declaración en la biblioteca estándar,
|
(desde C++23) |
[editar] Enlazado
Las entidades de la biblioteca estándar de C++ tienen enlazado externo. A menos que se especifique los contrario, los objetos y funciones tienen el enlazado extern "C++" predeterminado .
Si un nombre de la biblioteca estándar de C declarado con enlazado externo tiene enlazado extern "C" o extern "C++" está definido por la implementación. El estándar 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 de iniciarlo.
[editar] Requisitos de implementaciones de bibliotecas estándar
[editar] Garantías
Una cabecera C++ debe proporcionar declaraciones y definiciones que aparecen en
- la sinopsis de esa cabecera, o
- la sinopsis de otra cabecera que aparece incluido en la sinopsis de esa cabecera.
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 (ODR).
A no ser que se especifique lo contrario, todas las macros similares a objetos definidas por la biblioteca estándar de C que se expanden a expresiones constantes enteras se pueden usar en las directivas de preprocesamiento #if
.
Llamar a una signatura de función no miembro de la biblioteca estándar siempre resulta en una llamada a esa función. Por lo tanto, una implementación de biblioteca estándar conforme no puede definir funciones adicionales que no sean miembros que puedan ser invocadas por un programa de C++ válido.
Las signaturas 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 que no son operadores ni miembros no usan funciones de otro espacio de nombres que se encuentran mediante la búsqueda de nombres dependientes de argumentos.
Para cada declaración friend de una función (plantilla) dentro de una definición de clase (plantilla), no se proporciona ninguna otra declaración para esa función (plantilla).
Las signaturas de funciones de la biblioteca estándar sólo se pueden declarar constexpr si es necesario que sean constexpr (libstdc++ cmath es notablemente no conforme aquí). Si una cabecera proporciona declaraciones no definitorias de funciones o constructores constexpr, las definiciones correspondientes también deben proporcionarse dentro de esa cabecera. A no ser que se especifique lo contrario, cada función de la biblioteca estándar debe cumplir cada uno de los siguientes requisitos para evitar carreras de datos:
|
(desde C++11) |
Para cada clase definida en la biblioteca estándar de C++ que debe derivarse 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 los contrario, los tipos con nombres distintos serán tipos distintos.
A menos que se especifique los contrario, todos los tipos especificados en la biblioteca estándar de C++ son tipos no finales. |
(desde C++11) |
Si una función definida en la biblioteca estándar de C++ se especifica para generar una excepción (en una situación particular) de un tipo determinado, la excepción lanzada sólo puede tener ese tipo o un tipo derivado del mismo, de modo que un controlador de excepciones para el tipo base pueda capturarlo.
Las funciones de la biblioteca estándar de C sólo pueden generar excepciones cuando dicha función llama a una función proporcionada por el programa que genera una excepción (qsort() y bsearch() cumplen esta condición).
Las operaciones de destructor definidas en la biblioteca estándar de C++ nunca generan excepciones. Cada destructor de la biblioteca estándar de C++ se comporta como si tuviera una especificación de excepción de no lanzamiento.
Si una función en la biblioteca estándar de C++ informa de errores a través de un objeto std::error_code, el miembros category() de ese objeto debe devolver std::system_category() para los errores originados en el sistema operativo, o una referencia a un objeto std::error_category definido por la implementación para errores que se originan en otro lugar. Se deben definir los posibles valores de value() para cada una de esas categorías de error. Se pueden mover objetos de tipos definidos en la biblioteca estándar de C++. Las operaciones de movimiento pueden especificarse explícitamente o generarse implícitamente. A menos que se especifique lo contrario, dichos objetos movidos se colocarán en un estado válido pero inespecifico. Un objeto de un tipo definido en la biblioteca estándar de C++ puede asignarse por movimiento a sí mismo. A menos que se especifique lo contrario, dicha asignación coloca al objeto en un estado válido pero inespecifico. |
(desde C++11) |
[editar] Libertad de implementación
No se especifica si alguna función miembro o no miembro de la biblioteca estándar está definida como inline.
Para una función miembro dela biblioetac estándar de C++ no virtual , se puede declarar un conjunto diferente de signaturas de funciones miembro, siempre que cualquier llamada a esa función miembro que seleccione una sobrecarga del conjunto de declaraciones dado se comporte como si esa sobrecarga estuviera seleccionada. Esto permite, por ejemplo:
- añadir 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 signaturas adicionales para el nombre de una función miembro.
A menos que se indique lo contrario, la implementación define qué funciones de la biblioteca estándar de C++ se pueden volver a ingresar de forma recursiva.
Las implementaciones de la biblioteca estándar de C++ pueden compartir sus propios objetos internos entre subprocesos si los objetos no son visibles para los usuarios y están protegidos contra carrera de datos.. |
(desde C++11) |
No se especifica si alguna signatura 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 signaturas de funciones globales que se describen aquí están reservados para la implementación.
Cualquier clase de la biblioteca estándar de C++ puede derivarse de una clase con nombre reservado para la implementación. Si se requiere que una clase definida en la biblioteca estándar de C++ se derive de otras clases en la biblioteca estándar de C++, esa clase se puede derivar directamente de la base requerida o indirectamente de 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 generar una excepción pero no tiene una especificación de lanzamiento de excepción, la excepción generada 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 se puede fortalecer añadiendo una especificación de no lanzamiento de excepción.
[editar] Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 1 | C++98 | Los enlaces del lenguaje de los nombres de la biblioteca estándar de C no estaban definidos |
están definidos por la implementación |
LWG 119 | C++98 | las especificaciones de excepción de las funciones virtuales podrían reforzarse |
sólo permitido para funciones no virtuales |
LWG 147 | C++98 | la especificación sobre funciones no miembro sólo considera funciones globales |
también considera funciones no globales |
LWG 225 | C++98 | las funciones de la biblioteca estándar pueden llamar a funciones no miembros de otros espacios de nombres debido a la búsqueda dependiente de argumentos |
prohibido a menos que se especifique lo contrario |
LWG 336 | C++98 | <strstream> no era una cabecera de biblioteca C++ | es una cabecera de la biblioteca |
LWG 343 | C++98 | No se especificaron las dependencias de la cebecera de la biblioteca | especificado (enumerado en las sinopsis) |
LWG 456 | C++98 | las cabeceras de C++ para las funciones de la biblioteca de C sólo pueden proporcionar definiciones en el espacio de nombres std |
se permite definir en el espacio de nombres global y luego inyectar en el espacio de nombres std |
LWG 465 | C++98 | los identificadores que son palabras clave u operadores en C++ podrían definirse como macros en las cabeceras de la biblioteca estándar de C++(sólo se requiere <ciso646> para no definirlos como macros) |
todas la cabeceras de la biblioteca estándar de C++ no pueden definirlos como macros |
LWG 1178 | C++98 | las cabeceras de C++ deben incluir una cabecera de C++ que contenga cualquier definición necesaria |
las cabeceras de C++ deben proporcionar declaraciones y definiciones que se incluyan directa o indirectamente en su sinopsis |
LWG 2013 | C++11 | no estaba especificado si las funciones que el estándar no requiere que sean constexpr pueden ser declaradas constexpr por la biblioteca estándar |
prohibido |