Il sera officiellement publié vers la fin de 2020, après un dernier cycle de travail éditorial de l'ISO. Même s'il arrivait qu'il soit publié en 2021, il sera toujours appelé C++20, car le WG21 a terminé ses travaux techniques en février. En résumé, C ++ 20 apporte les Modules, les Coroutines, l’ajout de l’opérateur ⇔ à la bibliothèque standard, les Concepts et autres.
Comme annoncé en février dernier, le comité ISO C++ 20 a tenu sa réunion d’été la semaine passée à Cologne, en Allemagne. Le compte rendu de la réunion indique que les travaux sont achevés pour le C++ 20 et un brouillon sera diffusé avant la fin de l’été. Au cours de la réunion, quelques ajouts et modifications ont été apportés au brouillon du C++ 20 présenté en février dernier par le comité. La norme internationale C++ 20 est prévue pour être publiée officiellement en février 2020 à Prague.
Au cours de la précédente réunion de février, le comité ISO C++ 20 avait ajouté plusieurs nouvelles fonctionnalités au langage. Parmi ces fonctionnalités figurent les Coroutines et les Modules. Les Modules constituent une nouvelle alternative aux fichiers d’entête et apportent un certain nombre d’améliorations clés notamment en isolant les effets des macros et en permettant des générations évolutives. Cette fonctionnalité permet aux utilisateurs du langage de définir une limite d’encapsulation nommée. Les Coroutines sont des fonctions qui peuvent suspendre et reprendre leur exécution tout en conservant leur état.
À l’issue de la réunion de la semaine passée, il a été rapporté que quelques ajouts et modifications ont de nouveau été apportés à la spécification C++ 20. Selon le compte rendu présenté sur Reddit, de nouvelles fonctionnalités ont été ajoutées et de nombreuses modifications ont également été apportées. Parmi les nouveaux ajouts, on peut citer std::format, l’intégration de l’opérateur ⇔ dans la bibliothèque standard du langage, etc., et les conteneurs constexpr. Herb Sutter, le président de comité de normalisation de la norme C++ 20, a apporté plus d’explications sur ces nouveaux ajouts :
std::format
std::format ajoute la prise en charge des chaînes de format à la bibliothèque standard C++, y compris pour les paramètres de type sécurisé et de position. Si vous connaissez les chaînes au format Boost.Format ou POSIX, ou même simplement printf, vous saurez exactement de quoi il s'agit. Selon lui, std::format donne le meilleur de printf (commodité) et le meilleur de iostreams (sécurité et extensibilité des iostreams), mais il ne se limite pas à iostreams. Il vous permet également de formater n’importe quelle chaîne. « Cela fait longtemps que j'attends cela, de sorte que je n'aurai plus jamais à utiliser l’entête iomanip », a-t-il déclaré à propos.
Stop Token and Joining Thread
Sutter a expliqué que cette fonctionnalité introduit deux nouveaux concepts. Premièrement, il s’agit d’un type de thread dont le destructeur se joint implicitement si vous ne vous êtes pas encore connecté ou détaché. Et deuxièmement, mais plus important encore, cette fonctionnalité constitue un mécanisme d'annulation composable général dans la bibliothèque standard que tous les types peuvent utiliser. Ce mécanisme porte le nom de stop_token.
Les conteneurs constexpr
Les conteneurs constexpr suivants ont été ajoutés à la norme C++ 20 : constexpr INVOKE, constexpr std::vector et constexpr std::string. Selon Sutter, cela signifie que beaucoup de code C++ ordinaire peut être exécuté à la compilation, y compris même les conteneurs vectoriels et chaînes dynamiques standard. « C’était quelque chose qui aurait été difficile à imaginer il y a quelques années à peine, mais cela montre de plus en plus que nous sommes sur un chemin où nous pouvons exécuter du code C ++ simple au moment de la compilation au lieu d’essayer d’exprimer ces calculs sous forme de métaprogrammes de modèle », a-t-il précisé à propos de ces ajouts.
L’utilisation des énumérations a été revue
Selon les explications sur la fonctionnalité, les énumérations dont il s'agit ici ne sont pas des classes. Ils sont plus proches des espaces de noms comprenant des variables en ligne. La syntaxe familière qui fonctionne pour les espaces de noms devrait donc également leur être appliquée, d’une manière ou d’une autre. Comme ils sont fermés, petits et ne contiennent pas de jeux de surcharge, l’on peut mieux faire que la directive using pour les espaces de noms et obtenir les identifiants dans la portée locale. L'introduction de cette fonctionnalité permettra de mieux nommer les énumérations.
Actuellement, les énumérations sont nommées avec un identifiant aussi court que possible, souvent jusqu'à l'absurdité, lorsqu'ils sont réduits à des abréviations totalement non descriptives. Avec cette fonctionnalité, les identifiants deviennent disponibles pour une recherche non qualifiée dans des contextes locaux où leur source est évidente, ce qui permet à l'utilisateur de l'énumération de contrôler le style de recherche au lieu de créer une sémantique de recherche dans le type de l'énumération.
Certaines modifications ont également été apportées au cours de la réunion de la semaine passée. Les Contrats ont été transférés de C++ 20 à un autre groupe d’étude. Selon Sutter, lors de cette réunion, il est apparu clairement que le comité n’a pas encore fini de concevoir les Contrats à temps pour C ++ 20. « Lorsque nous avions adopté la fonctionnalité il y a un an, nous pensions qu'elle était prête pour la norme, mais depuis lors, nous avons découvert des désaccords de conception persistants et des préoccupations que nous ne pouvions pas résoudre suffisamment pour obtenir un consensus (accord général sans objections soutenues). Les principaux soumissionnaires ont unanimement convenu que la bonne chose à faire est de différer sa publication », a-t-il déclaré.
Cependant, les Contrats sont une caractéristique importante, et les travaux sur celles-ci n’arrêtent pas, mais continuent. « J'espère que lors des prochaines réunions, nous ferrons de solides progrès dans ce domaine important », a-t-il expliqué à propos. Les composantes de la norme C++ 20 sont à présent connues. Un brouillon de comité sera publié dans les prochaines semaines et la publication officielle du C++ 20 est prévue pour le mois de février 2020. Voici une liste non exhaustive des fonctionnalités notables qui sont attendues pour C++ 20 :
- les Modules ;
- les Coroutines ;
- l’ajout de l’opérateur ⇔ à la bibliothèque standard ;
- les Concepts ;
- les Ranges ;
- les conteneurs constexpr ;
- les macros de test de fonctionnalité ;
- std::span ;
- std::format ;
- std::atomic_ref ;
- etc.
Sources : Rapport du Comité C++, Herb Sutter
Et vous ?
Que pensez-vous des fonctionnalités apportées à C++ 20 ?
Quelles autres fonctionnalités auriez-vous souhaité avoir pour le C++ 20 ?
Voir aussi
La conception de C++ 20 est achevée et le premier brouillon sera publié en juillet 2019. Les Modules et les Coroutines y sont présents
La réunion d'automne du comité WG21 sur l'ajout de fonctionnalités au C ++ 20 est achevée. Voici quelques nouveautés introduites au langage
La spécification de la nouvelle version du langage C++ (C++17) est finalisée. Quelles sont les nouveautés introduites ?