Introduction

Le projet de norme C++26 est désormais complet, selon Herb Sutter, expert C++ de longue date et ancien président du comité de normalisation ISO C++. Le projet finalisé introduit la réflexion, améliore la sécurité de la mémoire sans nécessiter de réécriture de code, ajoute des contrats avec des préconditions et des postconditions ainsi qu'une nouvelle instruction d'assertion, et établit un cadre unifié pour la concurrence et le parallélisme.

Contexte Technique

La réflexion est un mécanisme qui, selon Sutter, donne aux développeurs les clés de la mécanique interne de C++, permettant au langage de se décrire lui-même et de générer du code, et fournissant ainsi une base solide pour la métaprogrammation. Conformément à l'esprit de C++, la réflexion ne comporte aucune surcharge à l'exécution. Un exemple basique de ce que permet la réflexion est le code suivant, qui montre comment la réflexion permet une syntaxe spécialisée pour déclarer des interfaces C++ : class(interface) IFoo { int f(); void g(std::string); }; qui sera traduit en class IFoo { public: virtual int f() = 0; virtual void g(std::string) = 0; virtual ~IFoo() = default; IFoo() = default; protected: IFoo(IFoo const&) = default; void operator=(IFoo const&) = default; };

La réflexion peut simplifier l'évolution future de C++ en réduisant le besoin de nombreuses fonctionnalités de langage personnalisées, car beaucoup peuvent désormais être exprimées sous forme de bibliothèques à temps de compilation réutilisables - plus rapides à concevoir, plus faciles à tester et portables dès le premier jour.

Analyse et Implications

Un autre domaine où C++26 vise à apporter des améliorations significatives est la sécurité de la mémoire. Cela inclut l'élimination des comportements indéfinis lors de la lecture de variables locales non initialisées, ainsi que la sécurité des limites pour la plupart des types de la bibliothèque standard, y compris vector, span, string, string_view. Ces changements ont déjà été déployés en production chez Apple et Google, selon Sutter, sur des centaines de millions de lignes de code C++.

Les contrats C++26 amènent la programmation défensive dans le langage, améliorant à la fois la sécurité fonctionnelle et la sécurité de la mémoire. Ils permettent aux développeurs d'exprimer des préconditions et des postconditions qui ne doivent pas être violées lors de l'exécution d'une méthode. Les contrats permettent de déplacer les assertions dans les déclarations de fonctions, les rendant visibles pour les appelants et les outils d'analyse statique.

Perspective

Enfin, C++26 introduit std::execution comme un cadre pour exprimer et contrôler la concurrence et le parallélisme. Les trois principales abstractions du cadre sont les planificateurs, les expéditeurs et les récepteurs, qui peuvent être composés à l'aide d'un ensemble d'algorithmes asynchrones personnalisables. std::execution est conçu pour fonctionner bien avec les coroutines C++20 et facilite l'écriture de programmes utilisant une concurrence et un parallélisme structurés pour être exempts de courses de données par construction.

Les deux principaux compilateurs C++, GCC et Clang, ont déjà mis en œuvre la plupart des fonctionnalités C++26 pendant le processus de normalisation, et ces fonctionnalités seront bientôt intégrées dans les versions principales.