C++23
# C++23

C++23 es el nombre informal para la revisión de la ISO/IEC el estándar para el lenguaje de programación C++ que sigue a la revisión C++20. El borrador actual es N4878. Se estima que la versión sucesora será C++26.

En febrero de 2020, en la reunión final para C++20 en Praga, se adoptó un plan global para C++23: La primera reunión WG21 centrado en C++23 estaba planeada para junio de 2020 en Varna, pero se canceló debido a la pandemia de COVID-19, igual que la reunión de noviembre de 2020 en Nueva York y la reunión en Kona, Hawái en febrero de 2021 . Es poco probable que haya una reunión presencial antes de que 2022. Mientras tanto se llevan a cabo reuniones virtuales.

## Características nuevas

Las principales características esperadas para C++23, incluyendo algunas postergadas que no lograron entrar en C++20, son:

* biblioteca soporte para corrutinas
* reemplazo de headers por módulos en la biblioteca estándar
* ejecutores: permiten ejecutar código en diversos lugares (la propia CPU, en la GPU, en otra máquina)
* contratos: una alternativa superadora para assert<>, para la que se formó un nuevo grupo de estudio (SG21) para trabajar en una nueva propuesta
* reflexión
* metaclases
* extensiones para redes de datos: async, servicios básicos de I/O, timers, buffers, etc.
* propiedades: una forma de especificar interfaces, requiriendo propiedades por medio de conceptos
* extensión de futuros

Esta lista no está necesariamente confirmada para C++23, algunas características podrían postergarse para C++26, o incluso ser abandonadas.

En la ausencia de reuniones presenciales WG21, pocas características nuevas se han añadido al borrador de C++23. Pero las siguientes se agregaron luego de la reunión virtual de WG21 del 9 de noviembre de 2020, en la que se aprobaron mediante encuestas:

* Sufijos literales para std::size_t y el correspondiente tipo con signo
* Una función miembro contains para std::basic_string y std::basic_string_view, para comprobar si la string contiene una subcadena dada
* Un biblioteca <stacktrace>, basada en Boost.Stacktrace, para presentar la secuencia de invocaciones de funciones cuando el ejecutable aborta con un error
* Un tipo trait std::is_scoped_enum
* El encabezado <stdatomic.h> para interoperabilidad con C atomics

## Tecnologías habilitadoras

La gran mayoría de las características nuevas responden a un plan de largo plazo para habilitar mejores formas de programación. Las tecnologías que habilitan estas nuevas formas de programar no suelen centrarse en una característica nueva sino en un conjunto de ellas, que se implementan de a poco en diferentes versiones de C++. C++20 es la versión que más cambios transformadores ha introducido, con la introducción de módulos, corrutinas, rangos y conceptos como ejemplos prominentes. A modo de ejemplo, rangos es la consumación de una serie de características que se fueron añadiendo paulatinamente desde C++11.

No se espera que C++23 tenga el mismo impacto, pero ya se vislumbran algunas de las tecnologías generales que se podrían habilitar en esa versión:

### Definición programática de clases

C++ tiende a facilitar la escritura indirecta de clases: en lugar de escribir el código de la clase, se podrá escribir código para metaclases que funcione como una fábrica de clases en tiempo de compilación. La definición plantillada de clases opera en este sentido, C++ avanza hacia la posibilidad de escribir código claro en funciones y expresiones constantes (ejecutadas en tiempo de compilación) para un control preciso en la definición de clases. Las características involucradas son:

* Programación en tiempo de compilación
* Metaclases
* Reflexión
* Propiedades

Algunas de estas características tienen fuerte base en Conceptos, introducidos en C++20.

### Ejecutores

Algunas de las aplicaciones de los ejecutores que se están desarrollando para C++23:

* Microservicios
* Ejecución concurrente
* Aceleración por GPU
* Procesamiento distribuido

La posibilidad de lanzar porciones de código ejecutable en otros núcleos (incluso en otras máquinas en red) de manera eficiente inspira el desarrollo de estas características:

* Ejecutores (fuertemente basado en conceptos)
* Futuros (extensión de futuros atendiendo a los requerimientos de los ejecutores)

### Reemplazo del preprocesador

C++20 introdujo módulos, la primera alternativa real para #include. Sin embargo la propia biblioteca estándar no ha sido modularizada todavía, lo que está previsto para C++23. No se vislumbra la eliminación del preprocesador, que por ahora sigue siendo una pieza fundamental de C++, pero sí se reconoce el esfuerzo por presentar una alternativa completa para proyectos nuevos. El preprocesador será necesario siempre que se usen bibliotecas antiguas, y se podrá prescindir con bibliotecas renovadas basadas en módulos. En la próxima década se prevé una atenuación pronunciada del uso del preprocesador.

Los módulos no importan macros, lo que presenta un inconveniente en funciones basadas en ellas, como assert<>. Muchas macros se pueden reemplazar por funciones constantes, ejecutadas en tiempo de compilación. Éstas son algunas características que contribuyen a evitar el preprocesador:

* La biblioteca estándar adoptará módulos
* Programación en tiempo de compilación
* Contratos: una alternativa a assert
