Dans l'article sur le renforcement de la bibliothèque standard, nous avons vu que de nombreuses exigences de la bibliothèque sont exprimées sous forme de « contrats ». Cet article explore les contrats en C++26 et la manière de les appliquer à notre propre code.
La discussion commence par un exemple simple : une fonction qui renvoie une valeur d'un std::vector à un indice donné. Traditionnellement, l'exigence de validité de l'indice est imposée par assert dans le corps de la fonction. Cette approche présente des inconvénients. L'exigence se trouve dans l'implémentation, si bien que quelqu'un qui ne lit que la déclaration voit un vector et un indice, sans le lien entre les deux. Les assertions ne sont par ailleurs contrôlées que par NDEBUG, qui supprime entièrement la vérification lorsqu'elle est définie.
Les contrats de C++26, introduits par P2900, déplacent l'exigence dans la signature de la fonction, grâce à une clause pre(...) placée après la liste des paramètres. Cette précondition énonce une condition attendue à l'entrée de la fonction. La même exigence peut également figurer dans la déclaration, la rendant visible pour quiconque lit l'API. Les contrats offrent plusieurs sémantiques d'évaluation, notamment ignorer une vérification, signaler une violation puis poursuivre, ou terminer le programme ; c'est l'implémentation du compilateur qui détermine lesquelles sont disponibles et comment les sélectionner.
Les contrats distinguent aussi ce que l'appelant doit fournir de ce que la fonction promet de renvoyer. Les postconditions, introduites avec post, expriment ces promesses sans nécessiter de vérifications manuelles avant chaque instruction return. Les contrats sont ainsi utiles pour documenter les API, même lorsque la vérification à l'exécution est désactivée.
L'article se termine par un exemple complet de précondition et aborde d'autres sujets, comme les postconditions, le placement des contrats sur les déclarations et les définitions, les options du compilateur et des détails susceptibles de surprendre les développeurs.
Source: Hacker News · Résumé par HeadlinesBriefing