IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

C++ 20 est publié avec de nouvelles fonctionnalités pour le langage et la bibliothèque,
De nouveaux mots clés et rend obsolètes certaines anciennes fonctionnalités

Le , par Bill Fassinou

282PARTAGES

16  0 
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 toute dernière réunion du comité ISO C++ pour approuver les nouvelles fonctionnalités à venir dans C++ 20 s’est tenu la semaine passée à Kona, à Hawaii. À l’issu de cette réunion, le comité a annoncé que les fonctionnalités du prochain standard international (SI) du langage de programmation C++, le C++ 20 sont maintenant finalisées. Il a également indiqué qu’une prochaine réunion, prévue pour juillet prochain, mettra fin à la spécification et verra la publication d’un brouillon pour examen. Le président du comité de normalisation ISO C++, Herb Sutter, (également auteur, conférencier et architecte logiciel chez Microsoft) a déclaré ce qui suit : « Nous connaissons ainsi la plupart des fonctionnalités finales de C++ 20 ! Lors de notre prochaine réunion en juillet, nous prévoyons d’adopter officiellement quelques fonctionnalités supplémentaires qui ont été approuvées par la conception lors de cette réunion, mais qui n’ont pas encore été révisées dans leur intégralité. À la fin de la réunion de juillet, nous lancerons ensuite le premier bulletin de commentaires pour C++ 20 pour d’examen ».

Parmi les nombreuses nouvelles fonctionnalités approuvées pour le C++ 20, deux fonctionnalités majeures sont à noter. Il s’agit des fonctionnalités dénommées Modules et celles dénommées Coroutines. Comme l’explique Herb Sutter, les Modules constituent une nouvelle alternative aux fichiers d’en-tê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, une première depuis ses 35 ans d’âge selon Sutter. Il existait jusque-là trois fonctionnalités de ce type qui permettent aux programmeurs de créer leurs propres mots de pouvoir en (a) donnant un nom défini par l'utilisateur en (b) quelque chose dont l'implémentation est cachée, explique Sutter. Ce sont : la variable (qui encapsule la valeur actuelle), la fonction (qui encapsule le code et le comportement) et la classe (qui encapsule les deux pour délivrer un ensemble d’états et de fonctions).

Même des fonctionnalités majeures telles que les Modèles constituent des moyens de décorer ou de paramétrer ces trois fonctionnalités fondamentales. À ces trois, est ajoutée maintenant une quatrième, les Modules qui encapsulent les trois pour en livrer un ensemble. Les Coroutines quant à eux, sont des fonctions qui peuvent suspendre et reprendre leur exécution tout en conservant leur état. L'évolution en C++ 20 va encore plus loin. Le terme Coroutines est inventé par Melvin Conway, un informaticien. Il l'a utilisé dans sa publication pour la construction d'un compilateur en 1963. Cette fonctionnalité existe également dans les langages comme Python. L'implémentation spécifique de Coroutines en C++ est un peu intéressant. Au niveau le plus élémentaire, il ajoute quelques mots-clés à C++ comme co_return, co_await, co_yield ainsi que des types de bibliothèques qui fonctionnent avec eux. Une fonction devient une coroutine en ayant une de ces fonctions dans son corps.


Lorsqu'un de ces trois mots-clés est utilisé dans un corps de fonction, un examen standard obligatoire du type de retour et des arguments est produit et la fonction est transformée en une coroutine. Cet examen indique au compilateur où stocker l'état de la fonction lorsque celle-ci est suspendue. La spécification s’est portée également sur d’autres fonctionnalités et modifications telles que :

  • l’extension des liaisons structurées et la capture de référence des liaisons structurées qui permettent à un nom introduit en tant que liaison structurée d'être utilisé de manière supplémentaire, par exemple d’être capturé par référence dans des lambdas ;
  • ⇔! === qui ajoute une meilleure prise en charge linguistique pour la composabilité lors de l'écriture <=> pour les types pouvant écrire un == plus efficace que d'utiliser l'opérateur <=> seul. Par exemple, le vecteur <T> peut court-circuiter la comparaison == en vérifiant d’abord si les deux vecteurs ont la même taille ;
  • changer span pour utiliser une taille non signée et ajouter des fonctions ssize() pour obtenir les tailles signées. Cette fonctionnalité rend std::span plus pratique à utiliser avec les types STL existants, tout en permettant l’utilisation de tailles et d’index signés via ssize( ) pour bénéficier des avantages de la signature ;
  • le polymorphic allocator. Il permet à pmr::memory_resource d'être utilisée partout où des allocateurs peuvent être utilisés dans la bibliothèque standard ;
  • etc.

Le comité à travers le reportage de Sutter, a indiqué que les processus tels que les exécuteurs et la mise en réseau continuent de progresser, les deux étant étroitement liés. « Nous espérions qu'une partie des exécuteurs serait prête pour le C++ 20, mais ils n'ont pas réussi la coupe. Ils sont tous deux sur la bonne voie pour bientôt, post C++ 20 (c'est-à-dire au début de la phase C++ 23) », a expliqué Herb Sutter, le président du comité. Beaucoup félicitent l’effort mis en œuvre par le comité pour offrir ces nouvelles fonctionnalités à la communauté C++ et l’encouragent à faire encore plus pour la prochaine standardisation du langage (C++ 23).

Cependant, certains expriment leur mécontentement par rapport au fait que la mise en réseau soit encore laissée de côté comme il a été le cas plusieurs fois déjà. Néanmoins, pour l’effort qui est fait, plusieurs y voient une expérience très excitante et encouragent à une adoption à grande échelle du C++ 20. Les autres fonctionnalités telles que les Concepts, les Ranges, les Contrats qui avaient été introduites dans C++ 20 avant cette réunion sont présentées et expliquées sur le site de l’ISO C++. Vous y retrouverez également d’autres annonces ainsi que le calendrier des autres événements à venir pour livrer complètement le C++ 20.

Source : Billet de blog

Et vous ?

Que pensez-vous de ces nouveautés de C++ 20 ?

Voir aussi

De C++14 à C++17, qu'est-ce qui a changé avec la nouvelle version du langage C++ : un document de la Standard C++ Foundation

La spécification de la nouvelle version du langage C++ (C++17) est finalisée quelles sont les nouveautés introduites ?

Le premier brouillon de la prochaine révision du standard C, le C2x, est publié et met l'accent sur la compatibilité du langage

Internet aurait de sérieux problèmes à cause de langages comme C et C++ favorisant la survenue de failles mais peu de développeurs s'en soucieraient
Vous avez lu gratuitement 1 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de
https://www.developpez.com
Le 18/12/2020 à 11:54
Citation Envoyé par 23JFK Voir le message
Va falloir que je me retape deux mille pages de spécifications.
Pourquoi ? Tu développes ton propre compilateur ?
5  0 
Avatar de Pyramidev
Expert éminent https://www.developpez.com
Le 05/01/2021 à 16:17
Citation Envoyé par lefjuls Voir le message
En relisant la discussion je pense comprendre ce qui me gêne. Je suis certain qu'il y a une bonne raison à l'ajout de toutes ces fonctionnalités, mais est-ce qu'un langage informatique à vocation à inclure toutes les fonctionnalités possibles ?
Comment apprend-on à développer en C++ en 2021 ? directement C++ 20 ou on commence par le C++(98) ? Car j'ai l'impression que selon la version le code produit n'aura pas grand chose à voir.
En vrai, parmi les propositions d'enrichissement du C++, il y en a beaucoup plus qui sont rejetées que acceptées. Mais c'est vrai que, contrairement au langage C qui n'évolue quasiment pas, la complexité du C++ est toujours croissante. À ce sujet, Bjarne Stroustrup avait écrit Remember the Vasa!
5  0 
Avatar de 23JFK
Inactif https://www.developpez.com
Le 17/12/2020 à 21:18
Va falloir que je me retape deux mille pages de spécifications.
4  0 
Avatar de jo_link_noir
Membre expert https://www.developpez.com
Le 18/12/2020 à 17:10
Citation Envoyé par onilink_ Voir le message
D'ailleurs j'ai pas trop suivis, mais qu'en est-il de l'unicode? C'est toujours autant le foutoir de parcourir une chaîne utf8 comme une liste chaînée?
Car dans mon cas je me suis retrouvé à ne pas passer par la bibliothèque standard, alors que ça me parait un peu essentiel comme feature (mais bon j'étais en C++11 quand j'ai eu le problème, j'imagine que ça a évolué).
Il y a des propositions et des discussions (comme les résumé de réunion), mais ce n'est pas pour tout de suite. Je crois qu'en C++20 il n'y a eu aucun ajout pour manipuler de l'unicode/utf-8. Après, il faut bien comprendre que utf-8 n'est pas trivial, il y a plein de corner case et d'optimisation possible selon le besoin. Par exemple, juste comparer une chaîne n'est pas triviale si on accepte les représentations non canoniques, car un même caractère peut être représenté sous différent point de code. Et du coup plein de question arrivent sur comment gérer telle ou telle forme de caractère, la gestion d'erreur, etc. Selon le besoin, on peut assez facilement trouver des libs qui font le travail. Pour quelque chose de plus complet, il faut probablement regarder dans boost ou ICU.

Pour ceux intéressés, on peut trouver la liste des propositions ici: http://www.open-std.org/jtc1/sc22/wg...1/docs/papers/. La dernière colonne des tableaux indique si le papier est rejeté/accepté/rien. Le RX dans les numéros de papier fait référence au nombre de révision (P0211R3: papier 211 révision 3). Du coup, il vaut mieux lire les pages en commençant par le bas.
3  0 
Avatar de Bktero
Modérateur https://www.developpez.com
Le 29/12/2020 à 14:53
J'ai commencé à m'intéresser ces dernières semaines à C++20 et franchement la liste des nouvelles fonctionnalités est vraiment hallucinante !

Le support par les principaux compilateurs (gcc, clang, msvc) commence à devenir très complet d'après ce tableau de cppreference : https://en.cppreference.com/w/cpp/compiler_support Depuis peu, gcc est devenu le premier à avoir implémenté toutes les fonctionnalités dites "core language"

Il y a des évolutions majeures dont le monde parle, comme les concepts et les ranges, il y a aussi plein d'ajouts super intéressants ! Personnellement, j'ai particulièrement apprécié std::span, qui me sera sûrement très utile pour m'interfacer avec du code C existant, ainsi que les nouvelles possibilités pour comparer les types (avec le spaceship operator et les =default sur les operateurs relationnels). Je suis aussi très pressé de voir des implémentations de std::format (qu'on peut utiliser pour l'instant avec la bibliothèque fmt). Et il faut aussi que j'explorer cette tripotée de trucs constexpr, parce que franchement des new constexpr, ça sonne dingue !

Franchement, il y a des belles choses dans cette version

A ceux qui disent que c'est trop compliqué, qu'il y a trop de trucs, je dirais trois choses :
1. tu n'es pas obligé de te servir des concepts si tu trouves ça trop compliqué
2. personne ne t'en voudra si tu ne connais pas std::is_constant_evaluated()
3. si tu as envie de coder std::span avec ton vieux C, je te regarde faire (laisse-moi juste le temps de prendre mon pop-corn)
3  0 
Avatar de Pyramidev
Expert éminent https://www.developpez.com
Le 30/12/2020 à 15:47
Citation Envoyé par lefjuls Voir le message
A qui sont destinées ces nouveautés ?
Par exemple sur cppreference la première phrase sur les modules est : "Modules are orthogonal to namespaces". Ça ne donne pas envie d'aller plus loin.
Les modules sont une fonctionnalité attendue depuis longtemps en C++. L'intérêt le plus visible est de réduire les temps de compilation dus en partie au système inefficace des #include pour simuler la modularité.
En effet, actuellement, quand un fichier ".h" qui n'appartient pas à un entête précompilé est inclus indirectement par n fichiers ".cpp", ce fichier ".h" est parsé n fois au lieu de une fois.
À une époque, on espérait avoir les modules en C++17. Quand ça a été reporté, une vidéo amusante avait recyclé le mème de Hitler :


Citation Envoyé par lefjuls Voir le message
Ou était-ce utile d'ajouter une "Three-way comparison" ?
Oui. L'intérêt de cette fonctionnalité, ce sont les performances.
Pour illustrer les problèmes de performance de l'opérateur < dans certains cas, prenons pour exemple le cas de la définition de < pour un tuple :
Compares lhs and rhs lexicographically by operator<, that is, compares the first elements, if they are equivalent, compares the second elements, if those are equivalent, compares the third elements, and so on.

For non-empty tuples, (3) is equivalent to
Code : Sélectionner tout
1
2
3
4
5
6
if (std::get<0>(lhs) < std::get<0>(rhs)) return true;
if (std::get<0>(rhs) < std::get<0>(lhs)) return false;
if (std::get<1>(lhs) < std::get<1>(rhs)) return true;
if (std::get<1>(rhs) < std::get<1>(lhs)) return false;
...
return std::get<N - 1>(lhs) < std::get<N - 1>(rhs);
Source : https://en.cppreference.com/w/cpp/ut...e/operator_cmp

On constate que std::get<0>(rhs) et std::get<0>(lhs) sont comparés deux fois (idem pour les autres indices sauf le dernier). Admettons que std::get<0>(rhs) et std::get<0>(lhs) sont des chaînes de caractères comparées par ordre lexicographique. Alors, pour ces deux chaînes, on parcourt deux fois au lieu d'une seule les premiers caractères identiques avant de tomber sur le caractère qui permet de dire quelle chaîne est plus grande que l'autre.

Par contre, pour l'opérateur <=>, pour chaque indice, il n'y a bien qu'une seule opération :
For non-empty tuples, (7) is equivalent to
Code : Sélectionner tout
1
2
3
4
if (auto c = synth_three_way(std::get<0>(lhs), std::get<0>(lhs)); c != 0) return c;
if (auto c = synth_three_way(std::get<1>(lhs), std::get<1>(lhs)); c != 0) return c;
...
return synth_three_way(std::get<N - 1>(lhs), std::get<N - 1>(lhs));
where synth_three_way is an exposition-only function object performing synthesized three-way comparison.
L'absence initiale de l'opérateur <=> est une erreur de jeunesse du C++ que le C++20 cherche à rattraper en retard.
En Rust, on a bien l'équivalent de <=> (std::cmp::Ord::cmp) pour définir une comparaison pour une relation d'ordre totale.

Citation Envoyé par lefjuls Voir le message
j'ai un peu l'impression que c'est une vitrine la recherche informatique sur les langages de programmation. Le but est de caser toutes les notions possibles dans un langage.
Non, en règle générale, le C++ intègre tard des fonctionnalités pour lesquelles on s'est rendu compte depuis longtemps qu'elles étaient utiles.
3  0 
Avatar de ParseCoder
Membre averti https://www.developpez.com
Le 17/12/2020 à 14:05
Avec les concepts, modules et coroutines c'est une excellente fournée!
1  0 
Avatar de onilink_
Membre émérite https://www.developpez.com
Le 18/12/2020 à 14:53
Ça envoie du lourd cette nouvelle norme.
Dommage que je sois coincé en C++14.
Heureusement que certaines petites choses sont déjà accessibles, comme span de https://github.com/Microsoft/GSL

D'ailleurs j'ai pas trop suivis, mais qu'en est-il de l'unicode? C'est toujours autant le foutoir de parcourir une chaîne utf8 comme une liste chaînée?
Car dans mon cas je me suis retrouvé à ne pas passer par la bibliothèque standard, alors que ça me parait un peu essentiel comme feature (mais bon j'étais en C++11 quand j'ai eu le problème, j'imagine que ça a évolué).
1  0 
Avatar de lefjuls
Membre à l'essai https://www.developpez.com
Le 05/01/2021 à 12:26
Citation Envoyé par Pyramidev Voir le message
Non, en règle générale, le C++ intègre tard des fonctionnalités pour lesquelles on s'est rendu compte depuis longtemps qu'elles étaient utiles.
En relisant la discussion je pense comprendre ce qui me gêne. Je suis certain qu'il y a une bonne raison à l'ajout de toutes ces fonctionnalités, mais est-ce qu'un langage informatique à vocation à inclure toutes les fonctionnalités possibles ?
Comment apprend-on à développer en C++ en 2021 ? directement C++ 20 ou on commence par le C++(98) ? Car j'ai l'impression que selon la version le code produit n'aura pas grand chose à voir.

Autre question plus intéressée, a-t'on un premier recule sur la conversion d'un code existant à l'utilisation des modules ?
Par exemple est-ce qu'il y a une date de "migration" de la librairie boost ?
1  0 
Avatar de Bousk
Rédacteur/Modérateur https://www.developpez.com
Le 05/01/2021 à 18:22
L'avantage c'est que le langage évolue mais ne casse (quasi) pas.
Ces fonctionnalités ne t'intéressent pas ? Pas de problème, tu peux t'en passer.
Comment apprend-on à développer en C++ en 2021 ? directement C++ 20 ou on commence par le C++(98) ? Car j'ai l'impression que selon la version le code produit n'aura pas grand chose à voir.
Le C++98 est obsolète à souhait. C++11 était le premier vrai game changer. La question elle est vite répondue.
Forcément le code a rien à voir. Il aura rien à voir non plus si tu prends un code encore plus vieux qui utilise pas la stl. Ou qui s'acharne à faire des new/delete et non utiliser unique_ptr. Ou qui continuer de créer des foncteurs quand une lambda est bien plus pratique.

sur cppreference la première phrase sur les modules est : "Modules are orthogonal to namespaces". Ça ne donne pas envie d'aller plus loin.
Je vois pas en quoi cette phrase pleine de sens pourrait rebuter.
C'est une information importante voire primordiale. C'est plutôt ta réaction qui est alarmante..

Honnêtement j'ai perdu le fil depuis C++ 14.
A qui sont destinées ces nouveautés ?
C'est sûr que si tu t'intéresses tous les 7 ans, ça va pas être simple de suivre...
C'est destiné entre autre à ceux qui l'ont mis en place, et aux codebases qui suivent les évolutions.
Ça simplifie des trucs, ou ajoutent des possibilités.
Si ton job utilise encore C++98, tu en bénéficieras pas et en verras sûrement pas les bénéfices et avantages.
Tu peux continuer à ignorer les move semantic ou te passer de constexpr. Tu peux aussi ne jamais utiliser de templates si ça te chante. Pour autant ces outils existent et ont une utilité réelle.
2  1