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 modificateur explicit de dépendre d'une expression booléenne [22].
  • Extension de constexpr aux fonctions virtuelles[23], union[24], try - catch[25], dynamic_cast et typeid[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érations enum 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 et std::allocate_shared sur les tableaux [37]
  • Pointeurs intelligents atomiques std::atomic<shared_ptr<T>> et std::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 et std::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 que memcpy() 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

  • Parallelism TS v2 [56].
  • Networking TS v1 [57]
  • Reflection TS v1 [58]

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 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 [69].
  • La plupart des usages de volatile [70].

Références

  1. « The Standard », isocpp.org (consulté le )
  2. Sutter, « P1000R3: C++ IS schedule », (consulté le )
  3. Dusíková, « N4817: 2020 Prague Meeting Invitation and Information », (consulté le )
  4. « Current Status », isocpp.org (consulté le )
  5. « C++20 Approved -- Herb Sutter », isocpp.org (consulté le )
  6. « ISO/IEC 14882:2020 »
  7. « Why does the C++ standard ship every three years? »
  8. « P0592R0: To boldly suggest an overall plan for C++20 »
  9. « P0606R0: Concepts Are Ready »
  10. « N4720: Working Draft, Extensions to C++ for Modules »
  11. Tim Shen et Richard Smith, « Designated Initialization Wording »
  12. Thomas Köppe, « Allow lambda capture [=, this] »
  13. « Familiar template syntax for generic lambdas »
  14. « Range-based for statements with initializer »
  15. « Wording for lambdas in unevaluated contexts »
  16. « Default constructible and assignable stateless lambdas »
  17. « Pack expansion in lambda init-capture », www.open-std.org (consulté le )
  18. « String literals as non-type template parameters »
  19. Nina Ranns et Daveed Vandevoorde, « Down with typename! »
  20. « Language support for empty objects »
  21. « Proposed wording for likely and unlikely attributes (Revision 5) »
  22. « explicit(bool) », www.open-std.org (consulté le )
  23. « Allowing Virtual Function Calls in Constant Expressions », www.open-std.org (consulté le )
  24. « P1330R0 - Changing the active member of a union inside constexpr »
  25. « P1002R0 - Try-catch blocks in constexpr functions »
  26. « P1327R0 - Allowing dynamic_cast, polymorphic typeid in Constant Expressions »
  27. « P1006R1 - Constexpr in std::pointer_traits »
  28. « P1073R2 - Immediate functions »
  29. « P1236R0: Alternative Wording for P0907R4 Signed Integers are Two's Complement »
  30. « P0668R4: Revising the C++ memory model »
  31. « P1091R1: Extending structured bindings to be more like variable declarations », www.open-std.org (consulté le )
  32. « P1091R2: Extending structured bindings to be more like variable declarations », www.open-std.org (consulté le )
  33. « N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines »
  34. « P1099R5: Using Enum », www.open-std.org, (consulté le )
  35. « P1143R2: Adding the constinit keyword », www.open-std.org, (consulté le )
  36. « P0896R3 »
  37. « Extending make_shared to Support Arrays »
  38. Meredith et Sutter, « Revising atomic_shared_ptr for C++20 », JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP, ISO (consulté le )
  39. « Utility to convert a pointer to a raw pointer »
  40. Howard E. Hinnant et Tomasz Kamiński, « Extending <chrono> to Calendars and Time Zones »
  41. Neil MacIntosh et Stephan T. Lavavej, « span: bounds-safe views for sequences of objects »
  42. Alisdair Meredith et Stephan T. Lavavej, « Adopt Consistent Container Erasure from Library Fundamentals 2 for C++20 »,
  43. Alan Talbot, « <version> »
  44. « Bit-casting object representations », www.open-std.org (consulté le )
  45. « Integrating feature-test macros into the C++ WD », www.open-std.org (consulté le )
  46. « P1032R1 - Misc constexpr bits »
  47. « Smart pointer creation with default initialization »
  48. « std::map::contains - cppreference.com », en.cppreference.com (consulté le )
  49. « P0553R4: Bit operations », www.open-std.org, (consulté le )
  50. « P0556R3: Integral power-of-2 operations », www.open-std.org, (consulté le )
  51. « P1355R2 Exposing a narrow contract for ceil2 », www.open-std.org, (consulté le )
  52. « On the names of low-level bit manipulation functions », www.open-std.org, (consulté le )
  53. Tomasz Kamiński, « Simplified partial function application »,
  54. « C++ keywords - cppreference.com », en.cppreference.com (consulté le )
  55. « attribute specifier sequence(since C++11) - cppreference.com », en.cppreference.com (consulté le )
  56. « C++ Extensions for Parallelism Version 2 »
  57. « C++ Extensions for Networking »
  58. « C++ Extensions for Reflection »
  59. (en) Sutter, « Trip report: Summer ISO C++ standards meeting (Cologne) », Sutter's Mill, (consulté le )
  60. (en) « Reflections on the reflection proposals - Meeting C++ », meetingcpp.com (consulté le )
  61. « Static reflection », www.open-std.org (consulté le )
  62. Herb Sutter, « Metaclasses »
  63. « A Unified Executors Proposal for C++ », www.open-std.org (consulté le )
  64. « N4771: Working Draft, C++ Extensions for Networking »
  65. « ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking »
  66. « A General Property Customization Mechanism », www.open-std.org (consulté le )
  67. « A Unified Futures Proposal for C++ »
  68. « Working Draft, Standard for Programming Language C++ (Annex C, §C.1) »
  69. « P1161R2: Deprecate uses of the comma operator in subscripting expressions », www.open-std.org (consulté le )
  70. « P1152R4: Deprecating volatile », www.open-std.org, (consulté le )

Liens externes

 

  • Portail de la programmation informatique
Cet article est issu de Wikipedia. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.