Mejoras de std::format en C++26: formateo de punteros, rutas, constexpr y más

Fuentes: Improvements to std::format in C++26

El estándar C++26 incorpora una serie de mejoras a la biblioteca de formateo que simplifican tareas habituales y eliminan hacks heredados. Una de las novedades más simples es la adición de una sobrecarga de std::println sin argumentos, que imprime una línea en blanco en la consola y evita tener que escribir explícitamente std::print("\n").

Hasta ahora, formatear punteros requería reinterpretar el puntero como un entero sin signo para poder imprimirlo con printf. C++26 resuelve esta limitación añadiendo soporte directo: los punteros se imprimen implícitamente en hexadecimal, y los especificadores p y P permiten elegir entre minúsculas y mayúsculas. Los punteros nulos se representan como 0x0, con relleno opcional.

Otra mejora clave afecta a std::filesystem::path. La versión actual obliga a recurrir a p.string() para obtener la ruta como cadena, lo que en Windows transcodifica incorrectamente a la página de códigos activa en lugar de UTF-8, produciendo textos ilegibles. C++26 introduce un std::formatter específico para rutas: por defecto se imprimen sin comillas, la opción ? ofrece una forma de depuración con escapes y la opción g fuerza los separadores genéricos (barra inclinada), útil en Windows.

El artículo también detalla que las funciones de formateo (std::format, std::vformat, std::format_to, std::format_to_n, std::formatted_size y sus variantes anchas) pasan a ser constexpr, lo que permite comprobaciones en tiempo de compilación mediante static_assert. La función std::runtime_format se renombra a std::dynamic_format y también se marca como constexpr, simplificando el caso de las cadenas de formato dinámicas. Entre las limitaciones pendientes destacan la ausencia de soporte para tipos de punto flotante, tipos chrono y formateo con configuración regional.