C++20: Nuevas características del lenguaje

C++ se encuentra en constante evolución. El primer proceso de estandarización internacional del lenguaje (ISO C++ 1998-2003) permitió la incorporación de técnicas de programación genérica y, con ellas, el desarrollo de una biblioteca estándar en la que algoritmos, estructuras de datos e iteradores se interrelacionaban de forma natural y eficiente.

Los estándares posteriores C++11/14/17 han proporcionado mejoras sustanciales al núcleo del lenguaje (inferencia automática de tipos, semántica de movimiento, inicialización uniforme, expresiones constantes, funciones lambda, etcétera), así como una notable extensión de la biblioteca estándar mediante la inclusión de punteros inteligentes, concurrencia, sistema de ficheros, expresiones regulares, tipos variantes y un largo etcétera.

El comité de estandarización se ha reunido recientemente en Kona (Hawaii, USA, Feb 18-23 2019) para concluir la especificación de C++20 [1]. El nuevo estándar promete revolucionar el modo en que pensamos y expresamos nuestro código, a la par que permanece fiel a los principios fundacionales de C++ (eficiencia, empleo de abstracciones de sobrecoste cero, retrocompatibilidad). Este post ofrece un breve adelanto de algunas de las principales funcionalidades incluidas en esta nueva versión del lenguaje:
  1. Módulos.
  2. Conceptos.
  3. Corrutinas.
  4. Contratos [Nota del autor: Esta funcionalidad fue retirada del estándar en el encuentro de Cologne en julio de 2019 para su reevaluación por parte del subgrupo de trabajo SG21].
  5. Rangos.

Simplificando el empleo de std::cin

Última actualización: 16 de octubre de 2021

Introducción: Gestión del flujo de entrada estándar


El objeto global std::cin de la clase std::istream, proporcionado en la cabecera <iostream>, controla la entrada de datos desde un búfer de flujo asociado con el objeto stdin, propio del lenguaje C y declarado en <cstdio>. Sus siglas significan character input y es una de las las principales herramientas --junto a std::cout-- empleadas en cualquier curso introductorio del lenguaje. El objetivo de este artículo es el de diseñar una biblioteca que facilite el empleo de std::cin en el ámbito de la enseñanza. Asumiremos aquí el caso tradicional en el que los objetos std::cout y std::cin representan, respectivamente, un flujo de salida y de entrada para la terminal.

El uso de flujos estándar I/O en C++ es poco eficiente en algunos contextos, aun cuando proporcionen una herramienta extensible con seguridad de tipos. Su modo de empleo adolece también de cierta complejidad, si bien el nuevo estándar del lenguaje C++20 incluye una función std::format() que facilita enormemente el formato de texto y la inserción de datos [1]. Como alternativa al uso de flujos de salida estándar, el programador puede recurrir a la biblioteca {fmt}lib, que en buena medida hace innecesario el empleo de objetos std::ostream (incluyendo std::cout) y funciones como std::printf() y std::fprintf() [2].

En relación a la extracción de datos, existe una propuesta de estandarización para C++23 que facilita el parseo de texto y que está encaminada a remplazar el uso tradicional de flujos std::istream (incluyendo std::cin) y funciones como std::scanf [3, 4]. Nuestro estudio será, por supuesto, menos ambicioso, limitándose a diseñar una biblioteca que simplifique el uso de std::cin en los primeros pasos de aprendizaje del lenguaje. En efecto, como justificaremos a continuación, el manejo de este objeto no está exento de dificultades y un correcto tratamiento de los posibles errores de formato en los datos de entrada puede resultar inconveniente para los más principiantes.