C++17

C++17, anciennement connu sous le nom de C++1z, est une norme pour le langage de programmation C++. Elle a été publiée en sous le nom de ISO/CEI 14882:2017.

Le dernier working draft gratuit est le N4659, qui date du , les seules différences avec le standard étant des corrections éditoriales.

Suppression

Cette version de C++ a non seulement ajouté de nouvelles fonctionnalités, mais en a également supprimé quelques-unes.

  • Suppression des trigraphes[1],[2].
  • Suppression de certains types et fonctions obsolètes de la bibliothèque standard, notamment std::auto_ptr, std::random_shuffle et les anciens adaptateurs de fonction[3],[4]. Celles-ci ont été remplacées dans C++11 par des fonctionnalités améliorées telles que std::unique_ptr, std::shuffle, std::bind et lambdas.
  • Suppression de l'utilisation (anciennement obsolète) du mot clé register en tant que spécificateur de classe de stockage[5]. Ce mot-clé reste réservé.

Nouvelles fonctionnalités

Langage

  • Le message de static_assert est facultatif [6].
  • Utilisation possible de typename (comme alternative à class) pour les paramètre de template template [7].
  • Nouvelles règles de déduction des braced-init-list avec auto[8],[3].
  • Définitions d'espace de noms imbriquées : namespace X::Y { } au lieu de namespace X { namespace Y { } } [3],[9].
  • Utilisation d'attributs sur les espaces de noms et les énumérateurs [10],[11].
  • Nouveaux attributs standard [[fallthrough]], [[maybe_unused]] et [[nodiscard]] [12].
  • Caractères littéraux UTF-8 (u8) [10],[13] (les chaines littérales UTF-8 existent depuis C++11).
  • Littéraux hexadécimaux à virgule flottante [14],[15].
  • Utilisation de auto pour les non-type template parameter [16].
  • Évaluation constante des arguments des non-type template parameter [10],[17].
  • fold expression pour les variadic template [10],[18].
  • if statique évalué à la compilation : if constexpr(expression) [15].
  • Déclarations structured binding : auto [a, b] = getTwoReturnValues(); [15].
  • Initialiseurs dans les instructions if et switch [19].
  • L'initialisation par copie et l'initialisation directe d'objets de type T partir de prvalue de type T (en ignorant les qualificatifs cv) n'entraîne l'appel d'aucun constructeur de copie ni de déplacement à partir de l'expression prvalue (élision de copie).
  • Déduction des arguments des classes templates disponiblespour les constructeurs[20],[21]. Autorisant l'écriture std::pair(5.0, false) au lieu d'exiger la fourniture explicite des types des arguments du constructeur std::pair<double, bool>(5.0, false) ou une fonction de construction intermédiaire std::make_pair(5.0, false).
  • Variables inline permettant la définition de variables dans les fichiers d'en-tête sans enfreindre la règle de définition unique (les règles sont similaires à celle des fonctions inline).
  • __has_include permettant de vérifier la disponibilité d'un en-tête par les directives du préprocesseur [22].
  • La valeur de __cplusplus est changée en 201703L [15].
  • Les spécifications d'exception ont été intégrées à la signature des fonctions [23].
  • Les expressions lambda peuvent capturer *this par valeur [24].

Bibliothèque

Références

  1. « N3981: Removing trigraphs??! (Richard Smith) »,
  2. IBM comment on preparing for a Trigraph-adverse future in C++17, IBM paper N4210, 2014-10-10. Authors: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
  3. « Updates to my trip report »
  4. « N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej) »
  5. « C++ Keywords: register »
  6. « N3928: Extending static_assert, v2 (Walter E. Brown) »
  7. « N4051: Allow typename in a template template parameter (Richard Smith) »
  8. « N3922: New Rules for auto deduction from braced-init-list (James Dennett) »
  9. « N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos) »
  10. « New core language papers adopted for C++17 »
  11. « N4266: Attributes for namespaces and enumerators (Richard Smith) »
  12. « N4640: Working Draft, Standard for Programming Language C++ », p. 193–195
  13. « N4267: Adding u8 character literals (Richard Smith) »
  14. Thomas Köppe, « Hexadecimal floating literals for C++ »
  15. « N4659: Working Draft, Standard for Programming Language C++ »
  16. James Touton et Mike Spertus, « Declaring non-type template parameters with auto »,
  17. « N4268: Allow constant evaluation for all non-type template arguments (Richard Smith) »
  18. « N4295: Folding expressions (Andrew Sutton, Richard Smith) »
  19. « Selection statements with initializer »
  20. « Class template argument deduction »
  21. « CppCon 2018: Timur Doumler “Class template argument deduction in C++17” »
  22. « N4640: Working Draft, Standard for Programming Language C++ », p. 431–433
  23. « P0012R1: Make exception specifications be part of the type system, version 5 »
  24. « P0018R3: Lambda Capture of *this by Value as [=,*this], version 3 »
  25. « Adopt Library Fundamentals V1 TS Components for C++17 (R1) »
  26. « Current Status »
  27. « std::basic_string_view - cppreference.com », en.cppreference.com (consulté le )
  28. « N4259: Wording for std::uncaught_exceptions (Herb Sutter) »
  29. « N4279: Improved insertion interface for unique-key maps (Thomas Köppe) »
  30. « New standard library papers adopted for C++17 »
  31. « N4280: Non-member size() and more (Riccardo Marcangelo) »
  32. « N4284: Contiguous Iterators (Jens Maurer) »
  33. « Filesystem Library Proposal (Beman Dawes) »
  34. « The Parallelism TS Should be Standardized »
  35. « Mathematical Special Functions for C++17, v5 »
  36. « A byte type definition »

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.