Lanzamiento de C++23: resumen de los cambios clave del nuevo estándar
Ha ocurrido un evento significativo en el mundo de los lenguajes de programación: el comité internacional de estandarización de C++ (ISO/IEC JTC1/SC22/WG21) ha aprobado oficialmente una nueva versión del lenguaje: C++23. Este lanzamiento, que reemplaza a C++20, no es revolucionario, pero contiene muchas mejoras esperadas y útiles que harán que el código sea más limpio, seguro y eficiente. Analicemos las novedades más importantes.
Principales novedades de C++23
1. std::print y std::println — el reemplazo moderno de cout
Quizás el cambio más notable para la programación diaria. Se han añadido a la biblioteca estándar las funciones std::print y std::println, basadas en el potente formateo de std::format (C++20). Ahora la salida a la consola no solo es más conveniente, sino también significativamente más rápida que con std::cout.
- Ejemplo:
std::println("¡Hola, {}! Respuesta: {}", nombre, 42); - Ventajas: seguridad de tipos, sintaxis legible, soporte para Unicode.
2. deducing this (P0847R7) — especificación explícita de this
Una de las novedades más potentes para la metaprogramación y la creación de bibliotecas. Ahora es posible pasar explícitamente el objeto this como parámetro de una función miembro. Esto resuelve problemas antiguos con lambdas y CRTP (Curiously Recurring Template Pattern).
- Permite escribir una única función miembro que funciona tanto con objetos const como no const.
- Simplifica la implementación del patrón "sobrecarga por calificadores".
3. Operadores operator[] multidimensionales (P2128R6)
Una capacidad largamente esperada: ahora operator[] puede aceptar múltiples argumentos. Esto es fundamental para bibliotecas que trabajan con arreglos multidimensionales (por ejemplo, mdspan o matrices propias).
- Antes:
matriz(2, 3)omatriz[{2,3}] - Ahora:
matriz[2, 3]— natural y conciso.
4. std::expected — manejo funcional de errores
Alternativa a las excepciones y los códigos de retorno. El tipo std::expected<T, E> contiene un valor correcto o un error. Esto es especialmente valioso en sistemas donde las excepciones están prohibidas (sistemas embebidos, núcleos de SO).
5. Mejoras en módulos y conceptos
Los módulos (C++20) recibieron correcciones y estabilización. Ahora tienen mejor soporte por parte de los compiladores. Los conceptos se han vuelto más flexibles, añadiendo la posibilidad de usar auto en los parámetros de los conceptos.
¿Qué más vale la pena destacar?
std::mdspan— span multidimensional para trabajar con arreglos.- Correcciones en
std::ranges— estabilización y cierre de brechas en la API. - Atributo
[[assume]]— sugerencias al compilador para optimización. - Llamadas estáticas a
operator()— posibilidad