C++20 – Compte rendu du meeting de San Diego

Bonjour tout le monde ! Aujourd’hui, l’article se consacrera aux modifications adoptées pour C++20 à l’issue du meeting de San Diego, qui a eu lieu début novembre.

Je vais essayer d’être concis sans entrer trop dans les détails, les explications techniques de certaines fonctionnalités auront leur place dans des articles dédiés. Pour ceux qui veulent plus d’informations sur le fonctionnement de la standardisation en C++, référez vous à ce précédent article (notez que depuis certains Working Groups (WG) ont été ajoutés et que la roadmap a légèrement changé, mais les principes sont les mêmes).

Le dernier meeting de cet été avait vu arriver l’adoption des contrats notamment, ainsi que diverses autres features. Les meetings intermédiaires de Chicago (LWG), et Seattle (design pour les modules et les executors) n’étant pas des réunions de la même ampleur.

D’après la P1000, San Diego était la dernière occasion de proposer des fonctionnalités inédites pour C++20, les prochaines étant dédiées à la finalisation du standard.

Ce post sur Reddit détaille les changements qui ont été adoptés pour C++20, ainsi que celles qui seront ne seront pas là avant C++23. Herb Sutter a d’ailleurs publié sont habituel trip report en début de semaine. Le meeting de San Diego a d’ailleurs battu tous les records de participation avec 274 papiers proposés avant l’événement.

Les ajouts

Concernant les fonctionnalités majeures, les ranges (d’Eric Niebler) ont donc officiellement été adoptées pour C++20. Les concepts avaient déjà précédemment été ajoutés, et j’ai toujours l’intention de faire une série d’articles sur ces deux sujets. San Diego a vu l’adoption de nouvelles règles pour les concepts (notamment avec le nouveau Concept auto).

Beaucoup de changements concernant les expressions constantes aussi ( constexpr) : try-catch (p1002), union (lien à venir), dynamic_cast et typeid  (lien à venir), std::pointer_traits (p1006r1), divers ajouts modifications pour notamment pair, tuple, array et les chaînes de caractères (p1032r1). Notez aussi l’apparition de consteval (p1073r2), qui permet entre autre de garantir l’évaluation à la compilation contrairement à  constexpr (il y aura certainement un article sur le sujet prochainement) :

Mais c’est n’est pas tout, il a aussi été décidé que les entiers signés seront maintenant codés en complément à deux, avec le papier p1236. Herb Sutter indique : “[this change] is the result of a courtroom drama in both WG21 (C++) and WG14 (C). After intense prosecutorial cross-examination, the witness finally admitted in both courts that, yes, all known modern computers are two’s complement machines, and, no, we don’t really care about using C++ (or C) on the ones that aren’t.“. Les prochaines version du C apporteront surement ce changement également.

Le modèle mémoire a subit quelques changements aussi, notamment pour le calcul sur processeur graphique : p0668r4 – “Revising the C++ memory model”.

Outre les très nombreux ajouts concernant des résolutions de bugs ou des précisions, on peut aussi citer char8_t pour la manipulation d’UTF-8 (p0482), les nested inline namespaces (p1094), std::assume_aligned (p1007), des modifications pour les contrats (p1289), std::is_constant_evaluated() (p0595), la suppression de l’opérateur d’égalité pour std::span (p1085), std::*_default_init (lien indisponible), le support des types incomplets dans std::reference_wrapper (p0357), visit<R> (p1085), la possibilité d’éviter la création de temporaires pour les recherches dans les conteneurs hétérogènes (p0919), l’application partielle de fonctions (p0356), et (croyez le ou non) j’en passe :p

Et maintenant ?

Pour la suite, certaines fonctionnalité ont été planifiées, à priori, pour C++20. Les contrats, les concepts et les ranges sont acceptées, mais certaines fonctionnalités majeures sont encore en attente.

Les coroutines arriveront normalement également, Herb Sutter indique qu’ils s’attendent à les inclure au prochain meeting. Il en va de même pour les modules.

Les executors, devraient pouvoir arriver pour C++20 en version “lite” puisque le design actuel a été approuvé même s’il n’a pas encore été intégré au standard, mais l’inclusion complète attendra surement C++23.

La reflexion, sera probablement incluse à C++20 sous forme de Technical Specification (TS) et intégrée pour C++23. Enfin, on devrait avoir du changement du côté de 2D Graphic prochainement.

On peut aussi noter la création de deux nouveau Study Groups (SG) : SG19 “Machine Learning”, qui vise principalement à offrir des améliorations de performance et d’optimisation pour les calculs matriciels, les tableaux, les graphes, l’algèbre linéaire etc… (et non pas à offrir directement des APIs de Machine Learning visiblement) et S20 “Education”, visant à améliorer l’enseignement du langage.

Encore une fois, le post reddit et les blogs des personnes impliquées vous donneront plus de détails sur les propositions encore en cours d’évaluation.

Le prochain meeting de Kona, premier trimestre 2019, sera la dernière occasion d’ajouter des fonctionnalités à C++20, qui sera ensuite considéré comme feature-complete. A bientôt pour plus de détails sur toutes ces fonctionnalités à venir :).


Références et ressources

%d bloggers like this: