La próxima gran revisión del estándar C++, conocida informalmente como C++26, ya está completa en cuanto a características y avanza por las últimas fases del proceso de aprobación ISO. Si C++20 fue el gran salto y C++23 la consolidación, C++26 apunta a ser la versión que aporta introspección, un modelo moderno de asincronía y una biblioteca estándar mucho más rica.
El borrador de trabajo actual es el documento N5014. Tras la reunión de junio de 2025 en Sofía, el comité congeló el conjunto de funcionalidades y envió el texto a los organismos nacionales para su revisión. El plan es terminar de resolver esos comentarios después de la reunión de noviembre de 2025 en Kona y enviar el borrador a aprobación final en torno a marzo de 2026.
En la práctica, los compiladores ya han empezado a experimentar con muchas de estas novedades, y C++26 se convertirá rápidamente en la referencia para el C++ moderno.
Reflexión: C++ aprende a mirarse a sí mismo
La funcionalidad más llamativa es la reflexión en tiempo de compilación. C++26 introduce un nuevo operador ^^ para consultar información sobre entidades del programa —tipos, funciones, miembros— directamente en el código y en tiempo de compilación.
En lugar de usar generadores de código externos o trucos de metaprogramación con plantillas, los desarrolladores podrán:
- Iterar sobre los miembros de una
structo clase - Inspeccionar atributos y anotaciones
- Generar código (por ejemplo, serializadores, bindings de GUI, stubs de RPC) en función de la estructura de los tipos de usuario
Todo esto se hace de forma estandarizada, a través de un nuevo encabezado <meta>, y no con extensiones específicas de cada proveedor. Ya existen varias implementaciones experimentales (forks de Clang, GCC y EDG) que se pueden probar en Compiler Explorer.
Miembros del comité como Herb Sutter y Hana Dusíková han descrito el impacto de la reflexión como “casi un lenguaje nuevo”, porque abre la puerta a patrones que antes requerían plantillas muy complejas o herramientas externas.
Contratos: el “design-by-contract” vuelve al estándar
C++26 también trae de vuelta los contratos, después del intento fallido y muy polémico que se retiró de C++20.
Esta vez la función está más acotada y se centra en:
- Una nueva palabra clave
contract_assert - Identificadores especiales
preypostque marcan precondiciones y postcondiciones
La idea es permitir que los desarrolladores escriban condiciones explícitas que deben cumplirse a la entrada y salida de una función, y que las implementaciones puedan decidir si las comprueban en tiempo de ejecución, las usan para optimización o ambas cosas.
El diseño sigue siendo discutido incluso dentro del comité, y algunos miembros han criticado aspectos del enfoque actual, pero alguna forma de contratos sí formará parte de C++26. La funcionalidad vivirá en un encabezado específico <contracts>, uniendo soporte de lenguaje y de biblioteca.
Más cosas en constexpr, incluidos los contenedores
C++26 continúa la tendencia de ampliar lo que se puede hacer en tiempo de compilación:
- Contenedores y adaptadores
constexpr: los contenedores estándar (y utilidades relacionadas) podrán usarse cada vez más en expresiones constantes, no solo en código de ejecución. constexprpara structured bindings, referencias a variablesconstexpr,placement newe incluso conversiones desdevoid*pasan a estar permitidos en contextosconstexpr.- También se permite lanzar excepciones durante la evaluación constante, lo que hace que el manejo de errores en cálculos de tiempo de compilación sea más uniforme.
Todo esto empuja a C++ hacia una programación muy potente en tiempo de compilación, donde más validación y más lógica pueden ejecutarse antes de que el binario se ejecute.
Ajustes del lenguaje: de pack indexing a = delete("reason")
Más allá de las grandes banderas, C++26 incluye muchos cambios pequeños pero importantes en el lenguaje:
- Pack indexing y la posibilidad de que los structured bindings introduzcan packs, mejorando la metaprogramación con plantillas y el código variádico.
- Atributos y condiciones para structured bindings, que los hacen más flexibles y mejor integrados con el flujo de control.
- Variables comodín sin nombre, útiles cuando el valor no importa pero la sintaxis exige una declaración.
- Una nueva directiva
#embed(heredada de C23) para incluir recursos binarios directamente en el programa, junto con__has_embedpara comprobar su disponibilidad desde el preprocesador. - Cadenas no evaluadas (“unevaluated strings”), pensadas sobre todo para reflexión y herramientas.
- El conjunto básico de caracteres garantiza ahora la presencia de **
@,$y`. - Una nueva forma
= delete("reason");permite adjuntar un mensaje explicativo al marcar una función como eliminada, produciendo diagnósticos más claros. - La llamada “Oxford variadic comma”: la sintaxis antigua
(int...)para parámetros variádicos sin coma previa se depreca; la forma preferida es(int, ...), compatible con C y más legible. - Limpieza general: se eliminan comparaciones de arrays ya obsoletas, borrar un puntero a un tipo incompleto pasa a ser un error de compilación, y las lecturas de memoria no inicializada se tratan de manera más estricta como comportamiento erróneo.
En conjunto, estos cambios afinan la superficie del lenguaje y hacen que los mensajes de error sean más útiles.
Biblioteca: de SIMD al álgebra lineal y los hazard pointers
En la biblioteca estándar, C++26 viene cargado de nuevas piezas, muchas dirigidas a código concurrente y de alto rendimiento:
<simd>: operaciones de acceso en paralelo de datos para explotar SIMD (Single Instruction, Multiple Data), facilitando escribir código vectorizado de forma portable.- Modelo asíncrono sender/receiver: una abstracción estándar para ejecución asíncrona y structured concurrency, inspirada en bibliotecas como Libunifex. Esto da por fin a la biblioteca estándar una base coherente para futuras APIs asíncronas.
- Planificador paralelo: un contexto estándar de ejecución asíncrona con garantías de progreso, que sirve de base más sólida para algoritmos paralelos y asíncronos.
<hazard_pointer>y<rcu>: primitivas de bajo nivel para la liberación segura de memoria en estructuras de datos concurrentes (hazard pointers y Read-Copy-Update).<inplace_vector>: un vector redimensionable con capacidad fija que almacena los elementos en memoria local, útil en código crítico donde hay que controlar las asignaciones dinámicas.<hive>: una estructura de datos que puede reutilizar eficazmente la memoria de los elementos borrados.
Hay también muchas incorporaciones más específicas:
std::copyable_function: un envoltorio de llamables (callable wrapper) más predecible y seguro questd::functionen ciertos escenarios.std::is_within_lifetime: utilidad para comprobar si un puntero apunta a un objeto que sigue dentro de su periodo de vida.std::submdspan: para trocearspans multidimensionales.- Mejor interoperabilidad entre tipos de cadena/flujo y
std::string_view; soporte de formatting parastd::filesystem::path. - Una nueva vista
std::views::concaty concatenación cómoda de cadenas ystring_view. <text_encoding>para acceder al registro de juegos de caracteres de IANA.std::ranges::generate_randompara generar rangos aleatorios.<linalg>: una interfaz de álgebra lineal alineada de forma aproximada con BLAS, que da a C++ una base estándar para operaciones con vectores y matrices.- Más
constexpren<cmath>y<complex>, hashing para tipos de valor destd::chrono, y un “protocolo de tuplas” parastd::complexpara que se lleve mejor con código genérico tipo tupla. - Soporte de los prefijos SI de 2022 (
std::quecto,std::ronto,std::ronna,std::quetta) en tiposratio. - Funciones de aritmética saturada como
std::add_satystd::div_sat. - Un encabezado
<debugging>pensado para ofrecer mejores puntos de anclaje a depuradores y herramientas.
Además, la biblioteca estándar se vuelve más robusta frente a desbordamientos de límites, acotando aún más el comportamiento indefinido en operaciones fuera de rango.
Lo que se ha quedado fuera
No todo ha entrado. Una de las propuestas más comentadas, la de trivial relocatability, se ha eliminado de C++26 y se ha pospuesto a un estándar futuro debido a errores de implementación y preocupaciones prácticas. Introducía propiedades como trivially_relocatable_if_eligible y replaceable_if_eligible para permitir optimizaciones más agresivas al mover objetos en memoria.
El mensaje del comité es claro: la funcionalidad se quiere, pero debe estar bien diseñada y ser implementable antes de convertirse en parte del lenguaje.
Un paso hacia un C++ introspectivo y asíncrono
Cuando C++26 se apruebe definitivamente, previsiblemente en 2026, consolidará una tendencia de una década:
- Más potencia en tiempo de compilación (reflexión, contenedores
constexpr, contratos,static_assertcon mensajes personalizados) - Una historia real de asincronía y concurrencia integrada en el estándar (sender/receiver, planificadores, SIMD, RCU, hazard pointers)
- Primitivas más ricas para matemáticas, texto y sistemas, que reducen la necesidad de utilidades externas ad-hoc
Para los desarrolladores, significa que C++ estará mejor preparado para cargas de trabajo modernas —servicios de alto rendimiento, código numérico, sistemas de baja latencia— ofreciendo a la vez herramientas más sólidas para la corrección y la introspección.
Y, como en revisiones anteriores, la adopción será gradual: muchas de las características de C++26 ya están apareciendo de forma experimental en compiladores y bibliotecas, permitiendo a los equipos empezar a experimentar mucho antes de que la tinta del estándar definitivo se haya secado.