"Hello, world!" en C++23

C++ ha conocido dos estándares en su etapa moderna que, por su alcance y extensión, han revolucionado la manera de programar en el lenguaje. Nos referimos, por supuesto, a C++11 y C++20. El próximo estándar del lenguaje, C++23, puede considerarse una actualización relativamente menor de C++20, de forma análoga a como C++14 y C++17 constituyeron extensiones naturales de C++11. Aun cuando la pandemia por COVID-19 de los últimos años haya afectado al proceso de trabajo habitual del comité ISO WG21, C++23 logrará publicarse en plazo presentando numerosas novedades, entre las que cabe señalar:

  • A nivel del núcleo del lenguaje: if consteval [1], deducción de this [2], atributos en expresiones lambda [3], atributo [[assume]] [4], auto(x) y auto{x} [5], directiva #warning [6].
  • A nivel de la biblioteca estándar: nuevas vistas std::views [7], <expected> [8], operaciones monádicas para std::optional [9], vistas para arrays multidimensionales <mdspan> [10], adaptadores de contenedores asociativos <flat_map> y <flat_set> [11, 12], generadores síncronos std::generator como soporte para corrutinas [13], funciones de impresión std::print y std::println en <print> [14].
A ello debemos añadir la posibilidad de importar la totalidad de la biblioteca estándar del lenguaje mediante la sencilla declaración [15]:

   import std;

La importación de la biblioteca completa se demuestra más rápida de compilar --típicamente en un factor 10-- que la mera inclusión de una única cabecera como #include <iostream>.

Con la estandarización de las funciones std::print y std::println inspiradas en la biblioteca {fmt}lib [16], el programa "Hello, world!" en C++23 tomaría así la forma:

   import std;    auto main() -> int    {       std::println("Hello, world!");    }

Un código tan sencillo como el anterior, en sintonía con lenguajes actuales como Python o Go, ayudará sin duda a facilitar el aprendizaje del lenguaje a los programadores principiantes.

A modo de ejemplo más elaborado, el siguiente código solicita al usuario la entrada por terminal de su nombre, con el fin de que el programa le dé la bienvenida. Nuevamente, el código resalta por su fácil comprensión, lo que debería ayudar a una primera toma de contacto con C++:

   import std;    auto main() -> int    {       using namespace std;             print("What's your name? ");       auto name = string{};       getline(cin, name);       println("Hello, {}!", name);    }

Ejemplos como los anteriores presentan a C++23 como un lenguaje moderno y asequible, apto para la enseñanza de los fundamentos de la programación desde los primeros cursos. En particular, la importación de la totalidad de la biblioteca estándar con una única declaración permite evitar la laboriosa labor de incluir, uno por uno, los ficheros de cabecera necesarios para el programa (en el ejemplo, <iostream>, <print> y <string>), punto éste que dificulta los primeros pasos en C++ de los programadores más noveles.


Referencias bibliográficas:
  1. P1938R3 - if consteval - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1938r3.html
  2. P0847R7 - Deducing this - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7.html
  3. P2173R1 - Attributes on Lambda-Expressions - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2173r1.pdf
  4. P1774R8 - Portable assumptions - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1774r8.pdf
  5. P0849R8 - auto(x): decay-copy in the language - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0849r8.html
  6. P2437R1 - Support for #warning - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2437r1.pdf
  7. P2214R1 - A Plan for C++23 Ranges - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2214r1.html
  8. P0323R12 - std::expected - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0323r12.html
  9. P0798R8 - Monadic operations for std::optional - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0798r8.html
  10. P0009R18 - mdspan - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0009r18.html
  11. P0429R9 - A Standard flat_map - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf
  12. P1222R4 - A Standard flat_set - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1222r4.pdf
  13. P2502R2 - std::generator: Synchronous Coroutine Generator for Ranges - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2502r2.pdf
  14. P2093R14 - Formatted output - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2093r14.html
  15. P2412R0 - Minimal module support for the standard library - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2412r0.pdf
  16. {fmt}lib - https://github.com/fmtlib/fmt

No hay comentarios:

Publicar un comentario