C++20
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 [3], approuvée le [4],[5], et publiée par l'ISO en [6].
Fonctionnalités
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] :
Langage
- Concepts[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<=>
. - Initialisation de variables dans l'instruction range-based
for
[14]. - Lambdas dans des contextes non évalués [15].
- Lambdas sans état constructibles et assignables par défaut [16].
- Pack extensions autorisés dans la capture par les lambda [17].
- Utilisation des chaînes littérales comme paramètres de templates [18].
Typename
facultatif dans certaines circonstances [19].- Nouveaux attributs standard
[[no_unique_address]]
[20],[[likely]]
et[[unlikely]]
[21]. explicit
conditionnel permettant au modificateurexplicit
de dépendre d'une expression booléenne [22].- Extension de
constexpr
aux fonctions virtuelles[23],union
[24],try
-catch
[25],dynamic_cast
ettypeid
[26],std::pointer_traits
[27]. - Nouveau mot-clé
consteval
imposant l'évaluation à la compilation d'une fonction[28]. - L'utilisation du complément à deux pour représenter les entiers signés devient obligatoire [29].
- Révision du modèle de mémoire [30].
- Diverses améliorations des structured binding : interaction avec la capture des lambda, durée de stockage statique et thread_local [31],[32].
- coroutines [33].
- Extension de
using
aux énumérationsenum class
[34]. - Mot-clé
constinit
impose l'initialisation constante d'une variable constante statique [35].
Bibliothèque
- 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].
Ajouts et modifications de mots clés
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
.
Nouveaux attributs : [[likely]]
, [[unlikely]]
et [[no_unique_address]]
[55].
Publication de Technical Specification
Reporté à une versionultérieure
- Contrats : un nouveau groupe d'étude (SG21) a été formé pour travailler sur une nouvelle proposition [59]
- Réflexion [60],[61].
- Métaclasses [62].
- Exécuteurs [63].
- Gestion du réseau[64],[65], 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 [66].
- Futures étendus [67].
Fonctionnalités supprimées et dépréciées
C++20 a également supprimé certaines fonctionnalités [68] :
- 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 :
Références
- « The Standard », isocpp.org (consulté le )
- Sutter, « P1000R3: C++ IS schedule », (consulté le )
- Dusíková, « N4817: 2020 Prague Meeting Invitation and Information », (consulté le )
- « Current Status », isocpp.org (consulté le )
- « C++20 Approved -- Herb Sutter », isocpp.org (consulté le )
- « ISO/IEC 14882:2020 »
- « Why does the C++ standard ship every three years? »
- « P0592R0: To boldly suggest an overall plan for C++20 »
- « P0606R0: Concepts Are Ready »
- « N4720: Working Draft, Extensions to C++ for Modules »
- Tim Shen et Richard Smith, « Designated Initialization Wording »
- Thomas Köppe, « Allow lambda capture [=, this] »
- « Familiar template syntax for generic lambdas »
- « Range-based for statements with initializer »
- « Wording for lambdas in unevaluated contexts »
- « Default constructible and assignable stateless lambdas »
- « Pack expansion in lambda init-capture », www.open-std.org (consulté le )
- « String literals as non-type template parameters »
- Nina Ranns et Daveed Vandevoorde, « Down with typename! »
- « Language support for empty objects »
- « Proposed wording for likely and unlikely attributes (Revision 5) »
- « explicit(bool) », www.open-std.org (consulté le )
- « Allowing Virtual Function Calls in Constant Expressions », www.open-std.org (consulté le )
- « P1330R0 - Changing the active member of a union inside constexpr »
- « P1002R0 - Try-catch blocks in constexpr functions »
- « P1327R0 - Allowing dynamic_cast, polymorphic typeid in Constant Expressions »
- « P1006R1 - Constexpr in std::pointer_traits »
- « P1073R2 - Immediate functions »
- « P1236R0: Alternative Wording for P0907R4 Signed Integers are Two's Complement »
- « P0668R4: Revising the C++ memory model »
- « P1091R1: Extending structured bindings to be more like variable declarations », www.open-std.org (consulté le )
- « P1091R2: Extending structured bindings to be more like variable declarations », www.open-std.org (consulté le )
- « N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines »
- « P1099R5: Using Enum », www.open-std.org, (consulté le )
- « P1143R2: Adding the constinit keyword », www.open-std.org, (consulté le )
- « P0896R3 »
- « Extending make_shared to Support Arrays »
- Meredith et Sutter, « Revising atomic_shared_ptr for C++20 », JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP, ISO (consulté le )
- « Utility to convert a pointer to a raw pointer »
- Howard E. Hinnant et Tomasz Kamiński, « Extending <chrono> to Calendars and Time Zones »
- Neil MacIntosh et Stephan T. Lavavej, « span: bounds-safe views for sequences of objects »
- Alisdair Meredith et Stephan T. Lavavej, « Adopt Consistent Container Erasure from Library Fundamentals 2 for C++20 »,
- Alan Talbot, « <version> »
- « Bit-casting object representations », www.open-std.org (consulté le )
- « Integrating feature-test macros into the C++ WD », www.open-std.org (consulté le )
- « P1032R1 - Misc constexpr bits »
- « Smart pointer creation with default initialization »
- « std::map::contains - cppreference.com », en.cppreference.com (consulté le )
- « P0553R4: Bit operations », www.open-std.org, (consulté le )
- « P0556R3: Integral power-of-2 operations », www.open-std.org, (consulté le )
- « P1355R2 Exposing a narrow contract for ceil2 », www.open-std.org, (consulté le )
- « On the names of low-level bit manipulation functions », www.open-std.org, (consulté le )
- Tomasz Kamiński, « Simplified partial function application »,
- « C++ keywords - cppreference.com », en.cppreference.com (consulté le )
- « attribute specifier sequence(since C++11) - cppreference.com », en.cppreference.com (consulté le )
- « C++ Extensions for Parallelism Version 2 »
- « C++ Extensions for Networking »
- « C++ Extensions for Reflection »
- (en) Sutter, « Trip report: Summer ISO C++ standards meeting (Cologne) », Sutter's Mill, (consulté le )
- (en) « Reflections on the reflection proposals - Meeting C++ », meetingcpp.com (consulté le )
- « Static reflection », www.open-std.org (consulté le )
- Herb Sutter, « Metaclasses »
- « A Unified Executors Proposal for C++ », www.open-std.org (consulté le )
- « N4771: Working Draft, C++ Extensions for Networking »
- « ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking »
- « A General Property Customization Mechanism », www.open-std.org (consulté le )
- « A Unified Futures Proposal for C++ »
- « Working Draft, Standard for Programming Language C++ (Annex C, §C.1) »
- « P1161R2: Deprecate uses of the comma operator in subscripting expressions », www.open-std.org (consulté le )
- « P1152R4: Deprecating volatile », www.open-std.org, (consulté le )