Namespaces
Variants

C++ Standard Library

From cppreference.net

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

Nombres del Anexo K del estándar C
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

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 encabezados

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

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

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

  • el módulo al que se adjunta no está especificado, y
  • denota la misma entidad independientemente de si se hizo accesible mediante la inclusión de un encabezado, la importación de una unidad de encabezado, o la importación de un módulo de la biblioteca C++.
(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 :

  • Una función de la biblioteca estándar de C++ no puede (directa o indirectamente) acceder a objetos accesibles por hilos distintos al hilo actual, a menos que los objetos sean accedidos (directa o indirectamente) a través de los argumentos de la función, incluyendo this .
  • Una función de la biblioteca estándar de C++ no puede (directa o indirectamente) modificar objetos accesibles por hilos distintos al hilo actual, a menos que los objetos sean accedidos (directa o indirectamente) a través de los argumentos no const de la función, incluyendo this .
    • Por ejemplo, un objeto con duración de almacenamiento estático no puede usarse para fines internos sin sincronización porque esto puede causar una carrera de datos incluso en programas que no comparten objetos explícitamente entre hilos.
  • Una función de la biblioteca estándar de C++ no puede acceder a objetos indirectamente accesibles a través de sus argumentos o a través de elementos de sus argumentos de contenedor , excepto invocando funciones requeridas por su especificación en esos elementos del contenedor.
  • Una operación sobre iteradores obtenidos llamando a una función miembro de contenedor o string de la biblioteca estándar puede acceder, pero no modificar, el contenedor subyacente.
    • En particular, las operaciones de contenedor que invalidan iteradores entran en conflicto con operaciones sobre iteradores asociados con ese contenedor.
  • Una función de la biblioteca estándar de C++ solo puede realizar todas las operaciones únicamente dentro del hilo actual si esas operaciones tienen efectos que son visibles para los usuarios.
    • Las operaciones sin efectos secundarios visibles pueden ser paralelizadas.
(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ándar

Una 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:

  • Si la implementación está reforzada, antes de cualquier otro efecto secundario observable de la función, se evalúan una o más aserciones de contrato cuyos predicados se describen en la precondición reforzada con una semántica de verificación. Si alguna de estas aserciones se evalúa con una semántica no terminante y el manejador de violación de contrato retorna, el comportamiento es indefinido.
  • Si la implementación no está reforzada, cuando se viola una precondición reforzada, el comportamiento es indefinido.

Funciones miembro con precondiciones reforzadas

Categoría Contenedores de secuencia Vistas de contenedores Clases de cadena (vista) Utilidades generales
Arreglos numéricos
Clase array vector inplace_vector deque list forward_list span mdspan basic_string basic_string_view bitset optional expected valarray
(constructor) span mdspan
Acceso a elementos
operator* operator* operator*
operator-> operator-> operator->
operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[] operator[]
front front front front front front front front front front
back back back back back back back back back
error error
Subvistas first first
last last
subspan subspan
Modificadores pop_front pop_front pop_front pop_front
pop_back pop_back pop_back pop_back pop_back pop_back
remove_prefix remove_prefix
remove_suffix remove_suffix
(desde C++26)

Notas

libstdc++ , libc++ , y STL admiten el uso de módulos de la biblioteca estándar en modo C++20.

Macro de prueba de características Valor Estándar Característica
__cpp_lib_modules 202207L (C++23) Módulos de la biblioteca estándar std y std. compat
Solo implementación reforzada
__cpp_lib_hardened_array 202502L (C++26) std::array reforzado
__cpp_lib_hardened_basic_string 202502L (C++26) std::basic_string reforzado
__cpp_lib_hardened_basic_string_view 202502L (C++26) std::basic_string_view reforzado
__cpp_lib_hardened_bitset 202502L (C++26) std::bitset reforzado
__cpp_lib_hardened_deque 202502L (C++26) std::deque reforzado
__cpp_lib_hardened_expected 202502L (C++26) std::expected reforzado
__cpp_lib_hardened_forward_list 202502L (C++26) std::forward_list reforzado
__cpp_lib_hardened_inplace_vector 202502L (C++26) std::inplace_vector reforzado
__cpp_lib_hardened_list 202502L (C++26) std::list reforzado
__cpp_lib_hardened_mdspan 202502L (C++26) std::mdspan reforzado
__cpp_lib_hardened_optional 202502L (C++26) std::optional reforzado
__cpp_lib_hardened_span 202502L (C++26) std::span reforzado
__cpp_lib_hardened_valarray 202502L (C++26) std::valarray reforzado
__cpp_lib_hardened_vector 202502L (C++26) std::vector reforzado

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