C++20 — Wikipédia
- ️Wed Jan 01 2020
Un article de Wikipédia, l'encyclopédie libre.
C++20 | |
Date de première version | 2020![]() |
---|---|
Site web | www.iso.org/standard/79358.html![]() |
modifier ![]() |
C++20 est une version de la norme ISO / IEC définissant le langage de programmation C++[1]. La norme a été techniquement finalisée[2] par le WG21 lors de la réunion de Prague en février 2020[3], approuvée le 4 septembre 2020[4],[5], et publiée par l'ISO en décembre 2020[6].
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.
C++20 ajoute plus de nouvelles fonctionnalités majeures que C++14 ou C++17[7]. Les modifications qui ont été acceptées ou discutées pour inclusion dans C++20 incluent[8] :
- Concepts (en)[9].
- Module[10].
- Initialiseurs nommés[11] (basés sur la fonctionnalité C99).
- Capture de
[=, this]
par les lambda[12]. - Extension de la syntaxe des templates aux lambdas génériques[13].
- Comparaison trilatérale à l'aide de l'opérateur "spaceship" :
operator<=>
[14]. - Initialisation de variables dans l'instruction range-based
for
[15]. - Lambdas dans des contextes non évalués[16].
- Lambdas sans état constructibles et assignables par défaut[17].
- Pack extensions autorisés dans la capture par les lambda[18].
- Utilisation des chaînes littérales comme paramètres de templates[19].
Typename
facultatif dans certaines circonstances[20].- Nouveaux attributs standard
[[no_unique_address]]
[21],[[likely]]
et[[unlikely]]
[22]. explicit
conditionnel permettant au modificateurexplicit
de dépendre d'une expression booléenne[23].- Extension de
constexpr
aux fonctions virtuelles[24],union
[25],try
-catch
[26],dynamic_cast
ettypeid
[27],std::pointer_traits
[28]. - Nouveau mot-clé
consteval
imposant l'évaluation à la compilation d'une fonction[29]. - L'utilisation du complément à deux pour représenter les entiers signés devient obligatoire[30].
- Révision du modèle de mémoire[31].
- Diverses améliorations des structured binding : interaction avec la capture des lambda, durée de stockage statique et thread_local[32].
- coroutines[33].
- Extension de
using
aux énumérationsenum class
[34]. - Mot-clé
constinit
impose l'initialisation constante d'une variable constante statique[35].
- Ranges (One Ranges Proposal)[36].
std::make_shared
etstd::allocate_shared
sur les tableaux[37]- Pointeurs intelligents atomiques
std::atomic<shared_ptr<T>>
etstd::atomic<weak_ptr<T>>
[38]. std::to_address
pour convertir un pointeur en pointeur brut[39].- ajouts de calendriers et de fuseaux horaires à
<chrono>
[40]. 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)[41].std::erase
etstd::erase_if
simplifiant l'effacement des éléments pour la plupart des conteneurs standard[42].- Fichier d'en-tête
<version>
[43]. std::bit_cast<>
pour la conversion des représentations d'objets, moins verbeux quememcpy()
et capable d'exploiter les structures internes du compilateur[44].- Macros de test de présence de fonctionnalités[45].
- Généralisation de
constexpr
dans la bibliothèque standard[46]. - Fonctions d'initialisation par défaut des pointeurs intelligents[47].
- Fonction
std::map::contains
[48]. - Opérations binaires : comptage du nombre de zéro ou de un, en début ou en fin de nombre, rotation de bit[49].
- Manipulation de puissance de 2[50],[51],[52].
std::bind_front
[53].
Ajout de nombreux nouveaux mots-clés : concept
, constinit
[35], consteval
, co_await
, co_return
, co_yield
, requires
et char8_t
(support d'UTF-8)[54].
Ajout d'identifiants avec une signification particulière : import
et module
.
- Contrats : un nouveau groupe d'étude (SG21) a été formé pour travailler sur une nouvelle proposition[58]
- Réflexion[59],[60].
- Métaclasses[61].
- Exécuteurs[62].
- Gestion du réseau[63],[64], 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[65].
- Futures étendus[66].
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
etstd::result_of_t
.
Les fonctionnalités dépréciées incluent :
- L'utilisation de l'opérateur virgule dans les expressions d'indiçage[67].
- La plupart des usages de
volatile
[68].
- ↑ (en) « The Standard », isocpp.org
- ↑ (en) Herb Sutter, « P1000R3: C++ IS schedule » [PDF], 1er octobre 2019
- ↑ (en) Hana Dusíková, « N4817: 2020 Prague Meeting Invitation and Information » [PDF], 6 novembre 2019
- ↑ (en) « Current Status », isocpp.org
- ↑ (en) Herb Sutter, « C++20 approved, C++23 meetings and schedule update », Sutter's Mill, 6 septembre 2020
- ↑ (en) « ISO/IEC 14882:2020 »
- ↑ (en) Herb Sutter, « Why does the C++ standard ship every three years? », Sutter's Mill, 13 juillet 2019
- ↑ (en) Ville Voutilainen, « P0592R0 - To boldly suggest an overall plan for C++20 », 5 février 2017
- ↑ (en) Gabriel Dos Reis, « P0606R0 - Concepts Are Ready » [PDF], 25 février 2017
- ↑ (en) Gabriel Dos Reis, « N4720 - Working Draft, Extensions to C++ for Modules » [PDF], 29 janvier 2018
- ↑ (en) Tim Shen et Richard Smith, « P0329R4 - Designated Initialization Wording » [PDF], 12 juillet 2017
- ↑ (en) Thomas Köppe, « P0409r2 - Allow lambda capture [=, this] », 4 mars 2017
- ↑ (en) Louis Dionne, « P0428R2 - Familiar template syntax for generic lambdas », 13 juillet 2017
- ↑ (en) Herb Sutter, Jens Maurer et Walter E. Brown, « P0515R3 - Consistent comparison » [PDF], 10 novembre 2017
- ↑ (en) Thomas Köppe, « P0614R0 - Range-based for statements with initializer », 18 mars 2017
- ↑ (en) Louis Dionne et Hubert Tong, « P0315R4 - Wording for lambdas in unevaluated contexts », 10 novembre 2017
- ↑ (en) Louis Dionne, « P0624R2 - Default constructible and assignable stateless lambdas » [PDF], 10 novembre 2017
- ↑ (en) Barry Revzin, « P0780R0 - Pack expansion in lambda init-capture », www.open-std.org, 8 octobre 2017
- ↑ (en) Louis Dionne et Hana Dusíková, « P0424R2 - String literals as non-type template parameters » [PDF], 14 novembre 2017
- ↑ (en) Nina Ranns et Daveed Vandevoorde, « P0634R3 - Down with typename! », 14 mars 2018
- ↑ (en) Richard Smith, « P0840R2 - Language support for empty objects », 12 mars 2018
- ↑ (en) Clay Trychta, « P0479R5 - Proposed wording for likely and unlikely attributes », 16 mars 2018
- ↑ (en) Barry Revzin et Stephan T. Lavavej, « P0892R2 - explicit(bool) », 8 juin 2018
- ↑ (en) Peter Dimov et Vassil Vassilev, « P1064R0 - Allowing Virtual Function Calls in Constant Expressions », 4 mai 2018
- ↑ (en) Louis Dionne et David Vandevoorde, « P1330R0 - Changing the active member of a union inside constexpr » [PDF], 10 novembre 2018
- ↑ (en) Louis Dionne, « P1002R0 - Try-catch blocks in constexpr functions » [PDF], 1er avril 2018
- ↑ (en) Peter Dimov, Vassil Vassilev et Richard Smith, « P1327R1 - Allowing dynamic_cast, polymorphic typeid in Constant Expressions », 8 novembre 2018
- ↑ (en) Louis Dionne, « P1006R1 - Constexpr in std::pointer_traits » [PDF], 7 octobre 2018
- ↑ (en) Richard Smith, Andrew Sutton et Daveed Vandevoorde, « P1073R2 - Immediate functions », 4 octobre 2018
- ↑ (en) Jens Maurer, « P1236R0 - Alternative Wording for P0907R4 Signed Integers are Two's Complement », 8 octobre 2018
- ↑ (en) Hans-J. Boehm, Olivier Giroux et Viktor Vafeiades, « P0668R4 - Revising the C++ memory model », 24 juin 2018
- ↑ (en) Nicolas Lesser, « P1091R2 - Extending structured bindings to be more like variable declarations », 10 novembre 2018
- ↑ (en) Gor Nishanov, « N4649 - Working Draft, Technical Specification on C++ Extensions for Coroutines » [PDF], 3 mars 2017
- ↑ (en) Gašper Ažman et Jonathan Müller, « P1099R5 - Using Enum », 26 juillet 2019
- ↑ a et b (en) Eric Fiselier, « P1143R2 - Adding the constinit keyword », 18 juillet 2019
- ↑ (en) Eric Niebler, Casey Carter et Christopher Di Bella, « P0896R3 - The One Ranges proposal », 7 octobre 2018
- ↑ (en) Peter Dimov et Glen Fernandes, « P0674R1 - Extending make_shared to Support Arrays », 12 juillet 2017
- ↑ (en) Alisdair Meredith, « P0718R2 - Revising atomic_shared_ptr for C++20 », 10 novembre 2017
- ↑ (en) Glen Joseph Fernandes, « P0653R2 - Utility to convert a pointer to a raw pointer », 9 novembre 2017
- ↑ (en) Howard E. Hinnant et Tomasz Kamiński, « P0355R7 - Extending <chrono> to Calendars and Time Zones », 16 mars 2018
- ↑ (en) Neil MacIntosh et Stephan T. Lavavej, « P0122R7 - span: bounds-safe views for sequences of objects » [PDF], 16 mars 2018
- ↑ (en) Alisdair Meredith et Stephan T. Lavavej, « P1209R0 - Adopt Consistent Container Erasure from Library Fundamentals 2 for C++20 », 4 octobre 2018
- ↑ (en) Alan Talbot, « P0754R2 - <version> » [PDF], 13 mars 2018
- ↑ (en) JF Bastien, « P0476R2 - Bit-casting object representations », 10 novembre 2017
- ↑ (en) Ville Voutilainen et Jonathan Wakely, « P0941R2 - Integrating feature-test macros into the C++ WD », 8 juin 2018
- ↑ (en) Antony Polukhin, « P1032R1 - Misc constexpr bits », 1er octobre 2018
- ↑ (en) Glen Joseph Fernandes et Peter Dimov, « P1020R1 - Smart pointer creation with default initialization », 6 novembre 2018
- ↑ (en) Mikhail Maltsev, « P0458R2 - Checking for Existence of an Element in Associative Containers », 6 juin 2018
- ↑ (en) « P0553R4: Bit operations », www.open-std.org, 20 juillet 2019
- ↑ (en) Jens Maurer, « P0556R3 - Integral power-of-2 operations », 6 juin 2018
- ↑ (en) Chris Kennelly, « P1355R2 - Exposing a narrow contract for ceil2 », 11 juin 2019
- ↑ (en) Vincent Reverdy, « P1956R1 - On the names of low-level bit manipulation functions », 11 février 2020
- ↑ (en) Tomasz Kamiński, « P0356R3 - Simplified partial function application », 9 novembre 2017
- ↑ (en) « C++ keywords - cppreference.com », en.cppreference.com
- ↑ (en) Jared Hoberock, « N4793 - C++ Extensions for Parallelism Version 2 » [PDF], 26 novembre 2018
- ↑ (en) Jonathan Wakely, « N4711 - C++ Extensions for Networking » [PDF], 27 novembre 2017
- ↑ (en) David Sankel, « N4818 - C++ Extensions for Reflection » [PDF], 17 juin 2019
- ↑ (en) Herb Sutter, « Trip report: Summer ISO C++ standards meeting (Cologne) », Sutter's Mill, 20 juillet 2019
- ↑ (en) Jens Weller, « Reflections on the reflection proposals - Meeting C++ », meetingcpp.com, 2 mars 2017
- ↑ (en) Matus Chochlik, Axel Naumann et David Sankel, « P0194R6 - Static reflection », 16 mars 2018
- ↑ (en) Herb Sutter, « P0707R0 - Metaclasses » [PDF], 18 juin 2017
- ↑ (en) Jared Hoberock, Michael Garland, Chris Kohlhoff et al., « P0443R10 - A Unified Executors Proposal for C++ », 21 janvier 2019
- ↑ (en) Jonathan Wakely, « N4771 - Working Draft, C++ Extensions for Networking », 8 octobre 2018
- ↑ (en) « ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking »
- ↑ (en) David Hollman, Chris Kohlhoff, Bryce Lelbach et al., « P1393R0 - A General Property Customization Mechanism », 13 janvier 2019
- ↑ (en) Lee Howes, Bryce Adelstein Lelbach, David S. Hollman et Michał Dominiak, « P1054R0 - A Unified Futures Proposal for C++ », 7 mai 2018
- ↑ (en) Corentin Jabot, « P1161R2 - Deprecate uses of the comma operator in subscripting expressions », 21 janvier 2019
- ↑ (en) JF Bastien, « P1152R3 - Deprecating volatile », 20 juillet 2019