Le C++ 20 ajoute plus de nouvelles fonctionnalités majeures que le C++ 14 ou le C++ 17. Les changements qui ont été acceptés ou dont l'inclusion dans le C++ 20 a été discutée sont les suivants :
Langage : nouvelles fonctionnalités linguistiques
- concepts ;
- modules ;
- les initialisateurs désignés (basés sur la caractéristique C99, et l'extension G++ commune) ;
- [=, this] comme une capture lambda ;
- template de listes de paramètres sur les lambdas ;
- opérateur de comparaison à 3 voies "<=>" également appelé "opérateur spaceship" ;
- l'initialisation d'une variable supplémentaire dans une instruction for basée sur une plage ;
- les lambdas dans des contextes non évalués ;
- les lambdas apatrides constructibles et cessibles par défaut ;
- permettre l'extension des paquets dans les captures lambda init ;
- des littéraux de chaîne comme paramètres de template ;
- suppression de l'obligation d'utiliser typename afin de lever l'ambiguïté des types dans de nombreux contextes ;
- nouveaux attributs standard : [[no_unique_address]], [[likely]] et [[unlikely]] ;
- "explicit" conditionnel : il permet au modificateur explicite d'être conditionnel à une expression booléenne ;
- "constexpr" étendu : fonctions virtuelles, union, try and catch, dynamic_cast et typeid, [85] std::pointer_traits ;
- fonctions immédiates utilisant le nouveau mot-clé "consteval" ;
- les entiers signés sont maintenant définis pour être représentés en utilisant le complément à deux (le dépassement des entiers signés reste un comportement non défini) ;
- un template de mémoire révisé ;
- diverses améliorations des liaisons structurées (interaction avec les captures lambda, durée de stockage statique et thread_local) ;
- coroutines ;
- ajout du mot-clé "constinit".
nouvelles fonctionnalités de la bibliothèque
Nouveaux en-têtes
- <concepts> ;
- <coroutine> ;
- <compare> ;
- <version>
- <source_location> ;
- <format> ;
- <span> ;
- <ranges> ;
- <bit> ;
- <numbers> ;
- <syncstream>.
Dans la bibliothèque de support Thread :
- <stop_token> ;
- <semaphore> ;
- <latch> ;
- <barrier>.
Nouvelles fonctionnalités de la bibliothèque
- macros de test des fonctionnalités de la bibliothèque ;
- bibliothèque de formatage ;
- bibliothèque du calendrier et du fuseau horaire ;
- std::source_location ;
- std::span ;
- std::endian ;
- prise en charge des tableaux pour std::make_shared ;
- std::remove_cvref ;
- std::to_address ;
- virgule flottante atomique , shared_ptr atomique ;
- classes de coordination des threads : std::barrier, std::latch, et std::counting_semaphore ;
- std::jthread et classes d'annulation de threads : std::stop_token, std::stop_source, et std::stop_callback ;
- std::osyncstream ;
- std::u8string et autres utilisations de char8_t ;
- constexpr pour <algorithm>, <utility>, <complex> ;
- std::string::starts_with / ends_with et std::string_view::starts_with / ends_with ;
- std::assume_aligned ;
- std::bind_front ;
- std::c8rtomb/std::mbrtoc8 ;
- std::make_obj_using_allocator etc ;
- std::make_shared_for_overwrite/std::make_unique_for_overwrite ;
- recherche hétérogène dans des conteneurs associatifs non ordonnés ;
- std::pmr::polymorphic_allocator avec des fonctions membres supplémentaires et std::byte comme argument de template par défaut ;
- std::execution::unseq ;
- std::midpoint et std::lerp ;
- std::ssize ;
- std::is_bounded_array, std::is_unbounded_array ;
- Ranges ;
- effacement uniforme des conteneurs : std::erase/std::erase_if, par exemple std::erase(std::list) ou std::erase_if(std::map), etc. ;
- constantes mathématiques dans <numbers>.
Mots-clés nouveaux et modifiés
De nombreux nouveaux mots-clés ont été ajoutés (et le nouveau "spaceship operator", opérateur <=>, tels que concept, constinit, consteval, co_await, co_return, co_yield, requires (plus un changement de sens pour l'exportation), et char8_t. En outre, "explicit" peut prendre une expression depuis C++20. La plupart des utilisations du mot-clé "volatile" ont été dépréciées. Outre les mots-clés, il existe des identificateurs ayant une signification particulière, notamment les nouveaux modules et importations.
Publié sous forme de spécifications techniques
- Parallélisme TS v2 (y compris les blocs de tâches) ;
- Mise en réseau TS v1 ;
- Reflection TS v1.
Reporté à une norme ultérieure
- les contrats : un nouveau groupe d'étude (SG21) a été formé pour travailler sur une nouvelle proposition ;
- la réflexion ;
- les métaclasses ;
- les exécuteurs testamentaires ;
- les extensions de réseau, y compris async, les services d'E/S de base, les timers, les tampons et les flux orientés vers les tampons, les sockets et les protocoles Internet (bloqués par les exécuteurs).
Fonctionnalités supprimées et dépréciation
Le C++20 a également supprimé certaines fonctionnalités, notamment :
- les en-têtes dérivés du C <ccomplex>, <ciso646>, <cstdalign>, <cstdbool> et <ctgmath> ont été supprimés, car ils ne servent à rien en C++. (Les en-têtes <*.h> correspondants restent, pour des raisons de compatibilité avec le C.) ;
- l'utilisation de throw() comme spécification d'exception a été supprimée ;
- certaines fonctionnalités de la bibliothèque, auparavant obsolètes, 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 en indice a été dépréciée ;
- (la plupart des) "volatile" a été dépréciée.
Prise en charge du compilateur
Les développeurs des principaux compilateurs se sont préparés à la norme C++ 20 en mettant en place un support expérimental pour diverses fonctionnalités des versions préliminaires du C++ 20.
- Clang dispose d'une prise en charge partielle du C++ 20 qui peut être activée avec l'option -std=c++20 (version 10 et ultérieure) ou -std=c++2a (version 9 et antérieure) ;
- EDG eccp a commencé à mettre en œuvre les fonctionnalités du C++20 dans la version 5.0 et, à partir de la version 6.1, prend en charge la plupart des fonctionnalités du langage de base du C++ 20 ;
- GCC a ajouté un support partiel et expérimental du C++ 20 en 2017 dans la version 8 grâce à l'option -std=c++2a. Comme Clang, GCC a remplacé cette option par -std=c++20 dans la version 10. Il dispose également d'une option permettant d'activer les extensions GNU en plus du support C++ 20 expérimental, -std=gnu++20 ;
- Microsoft Visual Studio prend en charge certaines fonctionnalités du C++ 20 grâce à son option std:c++latest. Une option /std:c++20 permettant d'activer le mode C++ 20 est prévue dès que le compilateur aura terminé la fonctionnalité C++ 20.
Sources : Cppreference, ISO/CEI 14882:2020
Et vous ?
Que pensez-vous de la nouvelle norme du langage C++ 20 ?
Quelles fonctionnalités du C++ 20 attisent le plus votre curiosité ? Pourquoi ?
Voir aussi
Le comité ISO C++ a proposé une feuille de route pour C++ 23 et finalisé la nouvelle version du langage C++ 20, la norme devrait être publiée dans les mois à venir
La conception de C++ 20 est achevée et le premier brouillon sera publié en juillet 2019. Les Modules et les Coroutines y sont présents
De C++14 à C++17, qu'est-ce qui a changé avec la nouvelle version du langage C++ : un document de la Standard C++ Foundation