Nouveau Trouve le job que tu mérites sur Les Joies du Code

Thème d'affichage

C++26 est la première version du langage à se faire recaler au vote de l'ISO

Nicolas Lecointre ·
C++26 est la première version du langage à se faire recaler au vote de l'ISO

Le vote qui devait faire de C++26 la nouvelle version officielle du langage s'est terminé jeudi 22 octobre, et C++26 a été recalé !

Une grande première dans l'histoire du langage : jusqu'ici, toutes ses versions avaient été validées par ce vote.

Depuis C++14, le C++ sort une nouvelle version tous les trois ans, nommée d'après l'année où le comité en termine le texte. Tant que C++26 n'a pas passé ce vote, la dernière version officielle du langage reste C++23. Le comité prépare déjà C++29, prévue trois ans après C++26.

Ce rejet tient à un désaccord qui secoue la communauté du C++ : les contrats.

Cette grosse nouveauté de C++26 permet d'écrire, dans la déclaration d'une fonction, des conditions vérifiées à l'exécution. Bjarne Stroustrup, le créateur du langage, s'oppose lui-même à la version retenue.

Le résultat a été publié samedi par Robert Seacord, qui dirige le comité chargé du langage C à l'Organisation internationale de normalisation (ISO), celle qui publie les normes officielles du C comme du C++. Il y parle d'une journée un peu triste pour la communauté C++, que les contrats ont beaucoup divisée, et espère qu'elle saura se réconcilier pour passer à la suite.

Un pays, une voix

Le C++ est écrit par le comité WG21, un groupe d'experts de l'ISO. Fin mars, à Londres, ce comité avait bouclé le travail technique sur C++26, qui s'annonçait comme la plus grosse mise à jour du langage depuis C++11, il y a quinze ans.

Ce texte apporte trois grosses nouveautés : les contrats, la réflexion, qui permet au code d'examiner ses propres types pendant la compilation (lister les membres d'une classe, par exemple), et une bibliothèque standard plus sûre, qui vérifie notamment qu'on ne lit pas au-delà de la fin d'un tableau.

Le texte était prêt, mais pour devenir une norme officielle de l'ISO, il lui restait à passer le vote des pays.

Le dernier mot revient aux organismes nationaux de normalisation, à raison d'un vote par pays. La France a donc voix au chapitre, par l'AFNOR, qui la représente à l'ISO (le résultat publié ne détaille pas le vote de chaque pays).

Les règles de l'ISO posent deux conditions à l'adoption d'une norme, et C++26 n'en a rempli aucune. Il devait d'abord obtenir les deux tiers des voix des pays qui participent aux travaux, sans compter les abstentions. Il n'en a eu que 60 %, avec 12 pays pour et 8 contre.

La seconde condition porte sur tous les pays qui se sont prononcés, participants ou non : les voix contre ne doivent pas dépasser un quart des votes. Elles ont atteint 41 %.

Le revers est d'autant plus surprenant qu'en mars, les experts du comité, ceux qui écrivent le langage, avaient approuvé ce texte sans difficulté, par 114 voix contre 12.

Les contrats, la nouveauté qui fâche

Les contrats, tels que les décrit le texte de C++26, permettent d'écrire, directement dans la déclaration d'une fonction, ce qu'elle attend de celui qui l'appelle et ce qu'elle garantit en retour. Le programme vérifie ces conditions à l'exécution et, comme le recommande ce texte, s'arrête avec un message d'erreur si l'une d'elles n'est pas respectée.

L'informaticien français Bertrand Meyer a popularisé le principe dans les années 80 avec son langage Eiffel (cocorico), et des langages comme Ada ou D le proposent déjà.

La macro assert fait déjà ce genre de vérification, mais depuis le corps de la fonction, où personne d'autre ne la voit. Les contrats, eux, s'écrivent dans la déclaration, à la vue de ceux qui appellent la fonction, du compilateur, de l'IDE et des outils d'analyse de code.

Timur Doumler, l'un des auteurs de la proposition, donne cet exemple :

T& operator[] (size_t index)
  pre (index < size());  // précondition : l'index doit exister

void clear()
  post (empty());  // postcondition : le conteneur est vide après l'appel

Après pre et post, un troisième mot-clé, contract_assert, joue le rôle d'assert à l'intérieur du corps de la fonction.

Vous choisissez à la compilation le comportement de toutes ces vérifications. Le programme peut les ignorer, les exécuter en signalant chaque erreur sans s'arrêter, ou les exécuter et s'arrêter à la première erreur.

Le créateur du C++ dans le camp du non

Début août, Bjarne Stroustrup et quatre autres membres du comité ont publié le papier P4334R0, qui présente les contrats comme une menace existentielle pour le C++ (rien que ça). Venant du créateur du langage, ça fait son petit effet.

Ils leur reprochent d'abord de pouvoir être désactivés à la compilation. Selon eux, c'est justement l'approche des années 80 : on active les vérifications pendant les tests et on les retire en production, là où le code tourne pour de vrai.

Ils leur préfèrent des vérifications toujours actives, y compris en production : celles de la bibliothèque standard, par exemple, ne ralentiraient les programmes que de 0,3 %, d'après des mesures faites par Google en production.

Les cinq auteurs jugent aussi les contrats incomplets et pas assez éprouvés : ceux qui portent sur les fonctions virtuelles, par exemple, sont renvoyés à C++29. Ils se disent pourtant favorables à l'idée et proposent une version plus simple, écrite comme une bibliothèque plutôt qu'avec de nouveaux mots-clés ajoutés au langage.

Ils reprochent enfin au comité d'avoir tranché en comptant les voix, sans tenir compte de l'opposition de deux éditeurs de compilateurs, dont Microsoft.

Leur but est de retirer les contrats de C++26, pas de bloquer le reste du texte. Un autre papier, cosigné par l'un d'eux, estime que renvoyer C++26 au comité ne coûterait que quelques mois, et que les contrats pourraient revenir dans C++29 une fois complétés.

En face, seize membres du comité, dont Timur Doumler, leur ont répondu vendredi 23 octobre, une fois le vote terminé, pour demander que les contrats restent dans C++26.

Ils rappellent que les contrats sont en chantier au comité depuis 2004, qu'ils ont été adoptés en février 2025 par 100 voix contre 14, et que chaque objection a été examinée au fil de six réunions, de 2024 à 2026.

Si les contrats sortent de C++26, leurs défenseurs ne croient pas à un retour rapide dans C++29 : une première version des contrats avait déjà été retirée de C++20 en 2019. Il a d'ailleurs fallu six ans pour en faire adopter une version plus modeste.

Ils reprochent surtout à quelques opposants d'être allés plaider leur cause directement auprès des pays pendant le vote, avec le papier de Stroustrup et une pétition publique, lancée par l'un de ses coauteurs. Selon eux, ces opposants cherchent à obtenir des pays ce que le comité leur a refusé.

Bonjour l'ambiance.

Captain America encerclé dans un ascenseur par des hommes en costume qui le maîtrisent, dans une bagarre confuse et tendue

Ce que ça change pour les devs C++

Si vous écrivez du C++, rien ne change dans l'immédiat.

Les compilateurs n'attendent pas le feu vert de l'ISO pour implémenter les nouveautés : GCC 16, sorti fin avril, propose déjà les contrats et la réflexion, à titre expérimental. Clang, lui, ne gère encore ni les contrats ni la réflexion.

Le vote devait faire du texte de C++26 une norme officielle. Sa publication par l'ISO, attendue dans la foulée, est donc suspendue.

Le comité se retrouve en novembre à Búzios, au Brésil, où il devra répondre à chacun des commentaires envoyés par les pays avec leur vote.

La décision reviendra ensuite à l'ISO, sur recommandation du comité. Selon les règles de l'ISO, elle peut soumettre un texte révisé à un nouveau vote de huit semaines : les défenseurs des contrats veulent les y garder tels quels, le camp de Stroustrup les en retirer.

Ces règles permettent même d'abandonner C++26 purement et simplement, une issue qu'aucun des deux camps ne réclame.

Pour tester les contrats vous-même, GCC 16 les active avec l'option -std=c++26 (la réflexion demande en plus -freflection), et Compiler Explorer le propose en ligne, sans rien installer.

Sujets :

À propos de l'auteur

Nicolas Lecointre

Nicolas Lecointre

Fondateur des Joies du Code, je suis l'actualité et la culture des développeurs depuis 2012. Ancien développeur, je me consacre aujourd'hui entièrement au média.

Voir sa page auteur

Offres d'emploi

Voir toutes les offres

À lire également

Articles similaires