C++20
# C++20

El lenguaje de programación C++ está estandarizado por ISO/IEC, quienes publican una revisión cada 3 años desde 2011. C++20 es el nombre de la revisión del año 2020, que sigue a C++17. La próxima revisión será C++23.

El estándar quedó técnicamente concluido por WG21 en la reunión en Praga en febrero de 2020 y pasó la aprobación final el 4 de septiembre de 2020. En octubre de 2020 se encontraba en la etapa de trabajo editorial final.

C++20 añade más características importantes que C++14 o C++17. Abajo se listan algunas de estas características.

## Características nuevas

C++20 introdujo muchas características nuevas, siendo la versión que más cambios introdujo en el lenguaje. Las siguientes listas sólo mencionan algunas de estas características. El artículo Descripción de las nuevas características de C++20 profundiza en su descripción.

### Principales novedades

De la multitud de cambios introducidos, cuatro características largamente esperadas y potencialmente transformadoras, conocidas como the big four, se destacan sobre el resto:

* conceptos
   * especificaciones de tipos y clases aceptados en plantillas
* módulos
   * alternativa moderna al #include
* corrutinas
   * generalización de la idea de función, que se puede pausar e implementar generadores
* rangos
   * unificación de los contenedores STL con funciones generales de acceso, filtrado y manipulación de datos

Estas características nuevas se repiten en las siguientes listas más completas.

### Lenguaje

Novedades en el lenguaje:

* conceptos
* módulos
* inicializadores designados (basado en la característica de C99, que además es una extensión común de G++)
* [=, this] como captura lambda
* plantillas (templates) en lambdas
* comparación de tres sentidos con operator <=>
* una nueva inicialización de variables dentro de un range-based for
* lambdas en contextos no evaluados
* lambdas sin estado asignables con constructores por defecto
* admite expansiones de paquete en una captura lambda init-capture
* strings literales como parámetros de plantilla
* se retira la necesidad de typename en ciertas circunstancias
* nuevos atributos estándares [[no_unique_address]] , [[likely]] y [[unlikely]]
* constexpr expandido a varios casos
* funciones inmediatas utilizan la nueva palabra clave consteval
* enteros con signo ahora defidos en complemento a dos (el desbordamiento sigue siendo comportamiento indefinido)
* modelo de memoria revisado
* mejoras en structured bindings (interacción con capturas de lambda, duración de almacenamiento estático y local de hilo)
* corrutinas
* using en enums
* nueva palabra claveconstinit

### Bibliotecas

Novedades en la biblioteca estándar:

* rangos
* std::make_shared y std::allocate_shared para arrays
* smart pointers atómicos (como std::atomic<shared_ptr<T>> and std::atomic<weak_ptr<T>>)
* std::to_address para convertir un puntero a un puntero crudo
* agregados de calendario y zonas horarias en <chrono>
* std::span proporciona una vista de un array contiguo (similar a std::string_view pero mutable)
* <version>
* std::bit_cast<> para el casting de objetos, menos verborrágico que memcpy
* macros para evaluar características
* varios constexpr
* inicialización por defecto para la creación de smart pointers
* nuevo método std::map::contains
* operaciones de bit, como cuenta de ceros o unos iniciales o finales, operaciones log2, std::popcount

### Obsolescencia

* uso de comas en subíndices, como en array[x,y]
* volatile se volvió obsoleto en la mayoría de sus formas

### Nuevas palabras clave

Algunas palabras clave nuevas en C++20:

* operator <=>
* concept
* char8_t
* explicit
* asociadas a const
   * constinit
   * consteval
* asociadas a corrutinas
   * co_await
   * co_return
   * co_yield
* asociadas a módulos
   * import
   * module
   * requires
   * export
* atributos
   * [[likely]]
   * [[unlikely]]
   * [[no_unique_address]]

## Características publicadas como Especificaciones Técnicas

Aquellas partes mayores que implican un gran trabajo de especificación se llevan a cabo de forma desacoplada de las versiones de C++ , y manejan su propio calendario. Estos trabajos se conocen como "Especificaciones Técnicas" abreviados TS (Technical Specification).

* Paralelismo: Parallelism TS v2 (incluyendo bloques de tarea)
* Redes: Networking TS v1
* Reflexión: Reflection TS v1

Se espera que formen parte de C++23.

## Características reprogramadas para futuros estándares

Una de las etapas en la preparación de cada versión consiste en determinar qué características solicitadas se incluyen en la versión actual, y cuáles se postergan.

La postergación de una característica no asegura su inclusión en la versión siguiente ni garantiza que alguna vez sea lanzada.

Una característica postergada sigue recibiendo atención, y su inclusión en una versión depende, entre otras cosas, del estado de avance de su especificación.

Entre las características reprogramadas es común encontrar aquellas que cuentan con su propia especificación técnica (lo que implica que siguen su propio calendario de especificación).

Algunas características reprogramadasː

* Contratos
   * un grupo de estudio nuevo (SG21) ha sido formado para trabajar en una propuesta nueva
* Reflexión
* Metaclasses
* Ejecutores
* Extensiones de Networking incluyendo
   * async
   * servicios básicos de I/O
   * temporizadores
   * buffers
   * flujos orientados a buffers
   * sockets
   * protocolos de Internet (bloqueado por ejecutores)
* Propiedades
* Futuros extendidos

## Soporte por compiladores

En el pasado los compiladores comenzaban a soportar parcialmente una versión de C++ a partir del momento de su publicación. En la actualidad los desarrolladores de compiladores importantes se anticipan al estándar final implementando soporte experimental para varias características a partir de los borradores.

* Clang tiene soporte parcial C++20 habilitado con la opción -std=c++20 (versión 10 o posterior) o -std=c++2un (versión 9 y anteriores).
* GCC Añadió soporte parcial y experimental de C++20 en 2017 en su versión 8 por medio de la opción -std=c++2a. Como Clang, GCC reemplazó esta opción con -std=c++20 en su versión 10. También tiene una opción para habilitar extensiones GNU junto con el soporte experimental de C++20, -std=gnu++20.
* Microsoft Visual Studio soporta algunas características de C++20 a través de la opción std:c++latest.
