# C++20

C++20 est une version de la norme ISO / IEC définissant le langage de programmation C++. La norme a été techniquement finalisée par le WG21 lors de la réunion de Prague en février 2020, approuvée le 4 septembre 2020$^,$, et publiée par l'ISO en décembre 2020.
Le dernier working draft gratuit est le N4861, qui date du 1er avril 2020, les seules différences avec le standard étant des corrections éditoriales.

## Fonctionnalités

C++20 ajoute plus de nouvelles fonctionnalités majeures que C++14 ou C++17. Les modifications qui ont été acceptées ou discutées pour inclusion dans C++20 incluent :

### Langage

* Concepts (en).
* Module.
* Initialiseurs nommés (basés sur la fonctionnalité C99).
* Capture de [=, this] par les lambda.
* Extension de la syntaxe des templates aux lambdas génériques.
* Comparaison trilatérale à l'aide de l'opérateur "spaceship" : operator<=>.
* Initialisation de variables dans l'instruction range-based for.
* Lambdas dans des contextes non évalués.
* Lambdas sans état constructibles et assignables par défaut.
* Pack extensions autorisés dans la capture par les lambda.
* Utilisation des chaînes littérales comme paramètres de templates.
* Typename facultatif dans certaines circonstances.
* Nouveaux attributs standard [[no_unique_address]], [[likely]] et [[unlikely]].
* explicit conditionnel permettant au modificateur explicit de dépendre d'une expression booléenne.
* Extension de constexpr aux fonctions virtuelles, union, try - catch, dynamic_cast et typeid, std::pointer_traits.
* Nouveau mot-clé consteval imposant l'évaluation à la compilation d'une fonction.
* L'utilisation du complément à deux pour représenter les entiers signés devient obligatoire.
* Révision du modèle de mémoire.
* Diverses améliorations des structured binding : interaction avec la capture des lambda, durée de stockage statique et thread_local.
* coroutines.
* Extension de using aux énumérations enum class.
* Mot-clé constinit impose l'initialisation constante d'une variable constante statique.

### Bibliothèque

* Ranges (One Ranges Proposal).
* std::make_shared et std::allocate_shared sur les tableaux
* Pointeurs intelligents atomiques std::atomic<shared_ptr<T>> et std::atomic<weak_ptr<T>>.
* std::to_address pour convertir un pointeur en pointeur brut.
* ajouts de calendriers et de fuseaux horaires à <chrono>.
* std::span fournissant une vue sur un tableau contigu (analogue à std::string_view mais avec la possibilité de modifier la séquence référencée).
* std::erase et std::erase_if simplifiant l'effacement des éléments pour la plupart des conteneurs standard.
* Fichier d'en-tête <version>.
* std::bit_cast<> pour la conversion des représentations d'objets, moins verbeux que memcpy et capable d'exploiter les structures internes du compilateur.
* Macros de test de présence de fonctionnalités.
* Généralisation de constexpr dans la bibliothèque standard.
* Fonctions d'initialisation par défaut des pointeurs intelligents.
* Fonction std::map::contains.
* Opérations binaires : comptage du nombre de zéro ou de un, en début ou en fin de nombre, rotation de bit.
* Manipulation de puissance de 2$^,$$^,$.
* std::bind_front.

### Ajouts et modifications de mots clés

Ajout de nombreux nouveaux mots-clés : concept, constinit, consteval, co_await, co_return, co_yield, requires et char8_t (support d'UTF-8).
Ajout d'identifiants avec une signification particulière : import et module.

### Publication de Technical Specification

* Parallelism TS v2.
* Networking TS v1
* Reflection TS v1

### Reporté à une version ultérieure

* Contrats : un nouveau groupe d'étude (SG21) a été formé pour travailler sur une nouvelle proposition
* Réflexion$^,$.
* Métaclasses.
* Exécuteurs.
* Gestion du réseau$^,$, y compris asynchrone, services d'entrée/sortie de base, temporisations, tampons et flux orientés tampon, sockets et protocoles Internet (bloqués par les exécuteurs).
* Propriétés.
* Futures étendus.

## Fonctionnalités supprimées et dépréciées

C++20 a également supprimé certaines fonctionnalités :
* Les en-têtes dérivés du C <ccomplex>, <ciso646>, <cstdalign>, <cstdbool> et <ctgmath> ont été supprimés car inutiles en C++ (les en-tête <*.h> restent, pour la compatibilité avec C. ).
* L'utilisation de throw comme spécification d'exception a été supprimée.
* Certaines fonctionnalités de bibliothèque précédemment dépréciées ont été supprimées, notamment std::uncaught_exception, std::raw_storage_iterator, std::is_literal_type, std::is_literal_type_v, std::result_of et std::result_of_t.
Les fonctionnalités dépréciées incluent :
* L'utilisation de l'opérateur virgule dans les expressions d'indiçage.
* La plupart des usages de volatile.