Espacios de nombres
Variantes
Acciones

Biblioteca estándar de C++

De cppreference.com
< cpp

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 biblioteca C++
<algorithm> <iomanip> <list> <queue> <string>
<bitset> <ios> <locale> <set> <strstream>
<complex> <iosfwd> <map> <sstream> <typeinfo>
<deque> <iostream> <memory> <stack> <utility>
<exception> <istream> <new> <stdexcept> <valarray>
<fstream> <iterator> <numeric> <streambuf> <vector>
<functional> <limits> <ostream>
Cabeceras añadidas 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>
Cabeceras añadidas en C++14
<shared_mutex>
Cabeceras añadidas en C++17
<any> <execution> <memory_resource> <string_view> <variant>
<charconv> <filesystem> <optional>
Cabeceras añadidas en C++20
<barrier> <concepts> <latch> <semaphore> <stop_token>
<bit> <coroutine> <numbers> <source_location> <syncstream>
<compare> <format> <ranges> <span> <version>
Cabeceras añadidas en C++23
<expected> <flat_set> <mdspan> <spanstream> <stdfloat>
<flat_map> <generator> <print> <stacktrace>
Cabeceras añadidas en C++26
<debugging> <hazard_pointer> <linalg> <rcu> <text_encoding>
Cabeceras eliminadas
<codecvt> (desde C++11)(en desuso en C++17)(eliminado en C++26)
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):

Nombres del Anexo K de C estándar
abort_handler_s mbstowcs_s strncat_s vswscanf_s
asctime_s memcpy_s strncpy_s vwprintf_s
bsearch_s memmove_s strtok_s vwscanf_s
constraint_handler_t memset_s swprintf_s wcrtomb_s
ctime_s printf_s swscanf_s wcscat_s
errno_t qsort_s tmpfile_s wcscpy_s
fopen_s RSIZE_MAX TMP_MAX_S wcsncat_s
fprintf_s rsize_t tmpnam_s wcsncpy_s
freopen_s scanf_s vfprintf_s wcsnlen_s
fscanf_s set_constraint_handler_s vfscanf_s wcsrtombs_s
fwprintf_s snprintf_s vfwprintf_s wcstok_s
fwscanf_s snwprintf_s vfwscanf_s wcstombs_s
gets_s sscanf_s vprintf_s wmemcpy_s
gmtime_s mbstowcs_s vscanf_s vswscanf_s
abort_handler_s strcat_s vsnprintf_s wmemmove
ignore_handler_s strcpy_s vsnwprintf_s wprintf_s
localtime_s strerrorlen_s vsprintf_s wscanf_s
L_tmpnam_s strerror_s vsscanf_s
mbsrtowcs_s strlen_s vswprintf_s


[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 cabeceras

Las 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ódulos

La biblioteca estándar de C++ proporciona los siguientes módulos de biblioteca de C++:

  • El módulo denominado std exporta declaraciones en el espacio de nombres std proporcionadas por las cabeceras de la biblioteca de C++ importables (por ejemplo, std::rotr de <bit>) y las cabeceras de C++ para las funciones de la biblioteca de C (por ejemplo, std::puts de <cstdio>). Además, exporta declaraciones en el espacio de nombres global para funciones de asignación y desasignación de almacenamiento proporcionadas por <new> (por ejemplo, ::operator new).
  • El módulo denominado std.compat exporta las mismas declaraciones que el módulo de nombre std y, además, exporta declaraciones en el espacio de nombres global correspondientes a las declaraciones en el espacio de nombres std que proporcionan las cabeceras de C++ para las funciones de la biblioteca de C (por ejemplo,::fclose).

Para cada declaración en la biblioteca estándar,

  • el módulo al que se conecta no está especificado, y
  • denota la misma entidad independientemente de si se hizo accesible al incluir una cabecera, importar una unidad de cabecera o al importar un módulo de biblioteca de C++.


Macro de Prueba de característica Valor Estándar Comentario
__cpp_lib_modules 202207L (C++23) Módulos de biblioteca estándar std y std.compat
(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:

  • Una función de la biblioteca estándar de C++ no puede acceder (directa o indirectamente) a objetos accesibles por otros subprocesos distintos del actual a menos que se acceda a los objetos (directa o indirectamente) a través de los argumentos de la función, incluido this.
  • Una función de la biblioteca estándar de C++ no puede modificar (directa o indirectamente) objetos accesibles a subprocesos distintos del actual a menos que se acceda a los objetos (directa o indirectamente( a través de argumentos no constantes de la función, incluido this.
    • Por ejemplo, un objeto con duración de almacenamiento estático no se puede utilizar para propósitos internos sin sincronización poruqe hacerlo puede provocar carrera de datos incluso en programas que no comparten explícitamente objetos entre subprocesos.
  • Una función de biblioteca estándar de C++ no puede acceder a objetos accesibles indirectamente a través de sus argumentos o mediante elementos de sus argumentos contenedores, excepto invocando funciones requeridas por su especificación en esos elementos contenedores.
  • Una operación en iteradores obtenida llamando a un contenedor de la biblioteca estándar o a una función miembro de cadena puede acceder, pero no modificar, el contenedor subyacente.
    • En particular, las operaciones de contenedor que invalidan los iteradores entran en conflicto con las operaciones en los iteradores asociados a ese contenedor.
  • Una función de biblioteca estándar de C++ sólo puede realizar todas las operaciones dentro del subproceso actual si esas operaciones tiene efectos que son visibles para los usuarios.
    • Se pueden paralelizar operaciones sin efectos secundarios visibles.
(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