Bonjour à tous ! Le comité s’est réuni fin juillet à Cologne et je me suis donc dit que j’allais à nouveau vous faire un petit compte rendu des changements à venir à la suite de cela :).
Après le metting de San Diego en novembre 2018 (pour lequel j’avais également fait un petit compte rendu), le comité s’est à nouveau réuni fin juillet pour discuter de l’évolution du langage. Encore une fois, je ne vais pas entrer dans le détail de chaque ajout puisque ce sera probablement l’objet de prochains articles. Il s’agit ici de faire un petit tour des modifications apportées au langage.
Premier point à souligner, C++20 est maintenant feature-complete, c’est-à-dire que les fonctionnalités ajoutées au langage et à la bibliothèque standard sont figées et plus rien ne devrait être ajouté au draft d’ici la sortie officielle en 2020. Les prochains mois se concentreront sur des corrections de bug. Le programme du comité pour C++20 est disponible ici.
La nouvelle triste de ce meeting est la suppression des contrats, dont j’avais déjà parlé dans un précédent article, qui ont été sortis du draft C++20 et déplacés vers un groupe d’étude (SG 21). Il faudra donc attendre au minimum C++23 pour pouvoir en profiter. Si vous souhaitez plus d’information sur les raisons de ce report, dirigez vous vers la p1823.
Dans son habituel article post-meeting, Herb Sutter, indique que C++20 est la plus grosse mise à jour depuis C++11. Et en effet, entre les concepts, les ranges, les modules, les coroutines, les changements pour constexpr, le spaceship operator etc… il y a un grand nombre de nouveautés qui vont clairement profiter au langage.
A nouveau, un post reddit a été créé pour centraliser les ajouts qui sont officiellement inclus dans le draft de C++20. Je vous propose d’en faire un petit tour de ce qu’indique le post :
- constexpr allocation : allocation dans les expressions constantes, ce qui entraîne donc la possibilité d’avoir std::vector et std::string en constexpr, ce qui va grandement élargir les possibilités de programmation compile-time. Ajoutez à ça TODO() :: Permit trivial default initialization in constexpr contexts.
- std::format : permettant le formatage de chaîne ( std::format("Je suis {}.", name)). Notez que cet ajout n’inclue pas le formatage compile-time, les I/O formatés (il faudra pour le moment se contenter de passer des chaînes formatées via les opérateurs de flux classiques) et ne gère pas l’Unicode. Mais c’est à venir.
- Beaucoup de choses concernant la synchronisation : atomic waits, semaphores, atomic_flag::test, verrous, barrières, stop token and joining thread.
- source_location.
- using enum : permettant d’importer une enum class comme un namespace.
- le mot clef constinit : qui requiert qu’une variable ait une expression constante à l’initialisation (dans le but d’éviter le Static Initialization Order Fiasco).
- les nouvelles constantes mathématiques : pi, e, ln2, ln10, sqrt2, phi …
- changement de casse pour les concepts : passage de PascalCase à snake_case dans un soucis d’uniformité.
- [[nodiscard]] pour les constructeurs.
- Changement de la hiérarchie des concepts d’itérateurs.
- Vues :
- Intégration du spaceship operator dans la SL : vu le titre du papier, c’est probablement un Protoss qui l’a rédigé.
- Opérations sur les bits : rotl, rotr, popcount, count_one, count_zero…. qui mappent sur les instructions hardware correspondantes.
- Changements sur la déduction des arguments pour les classes template : notamment le support de la déduction pour l’aggregate initialization et les alias de templates.
- Déprécié : volatile.
Notez que cette liste n’est pas exhaustive. Tout cela s’ajoute donc à ce qui était déjà prévu depuis San Diego, avec notamment :
- Les modules.
- Les concepts.
- Les coroutines.
- Les ranges.
- Le spaceship operator (article correspondant).
- Feature test macros (article correspondant).
- std::span (article correspondant).
- Les designated initializers (articles correspondant).
- Les nouveaux attributs, à l’exception de ceux des regrettés contrats (articles correspondant).
Si vous souhaitez plus d’informations sur l’avancement des différents working groups, je vous conseille de lire en détail le post reddit correspondant.
En tout cas, ça fait beaucoup de changements à venir pour le C++, et donc autant de potentiels articles qui verront le jour prochainement pour détailler tout cela =).
En attendant, je vous remercie pour votre lecture et je vous dis à très bientôt !
Références et ressources
- [EN] reddit.com | 2019-07 Cologne ISO C++ Committee Trip Report
- [EN] Trip report: Summer ISO C++ standards meeting (Cologne)
- [EN] open-std.org | p1823r2 – “Remove Contracts from C++20”
- [EN] open-std.org | p0784r7 – “More constexpr containers”
- [EN] open-std.org | p0980r1 – “Making std::string constexpr”
- [EN] open-std.org | p1331r2 – “Permitting trivial default initialization in constexpr contexts”
- [EN] open-std.org | p0645r10 – “Text Formatting”
- [EN] open-std.org | p0660r10 – “Stop Token and Joining Thread”
- [EN] open-std.org | p1208r6 – “Adopt source_location for C++20”
- [EN] open-std.org | p1143r2 – “Adding the constinit keyword”
- [EN] open-std.org | p0631r8 – “Math Constants”
- [EN] open-std.org | p1754r1 – “Rename concepts to standard_case for C++20, while we still can”
- [EN] open-std.org | p1135r6 – “The C++20 Synchronization Library”
- [EN] open-std.org | p1152r4 – “Deprecating volatile”
- [EN] open-std.org | p1771r1 – “[nodiscard]] for constructors”
- [EN] open-std.org | p1207r4 – “Movability of Single-pass Iterators”
- [EN] open-std.org | p1456r0 – “Move-only views”
- [EN] open-std.org | p1035r7 – “Input Range Adaptors”
- [EN] open-std.org | p1035r7 – “The Mothership has landed”
- [EN] open-std.org | p0553r4 – “Bit operations”
- [EN] open-std.org | p1021r5 – “Filling holes in Class Template Argument Deduction”
- [EN] open-std.org | p1035r7 – “Input Range Adaptors”
You must log in to post a comment.