Résumé – Chap 9 – Quelques outils du C++ moderne
Le C++ moderne apporte plusieurs outils qui ne modifient pas fondamentalement la manière de programmer, mais rendent le code plus lisible, plus sûr et plus expressif. auto permet au compilateur de déduire le type d’une variable à partir de son initialisation sans supprimer le typage statique : le type reste parfaitement déterminé à la compilation. Il est particulièrement utile lorsque le type est long ou complexe, notamment avec les itérateurs et les expressions lambda, mais son utilisation systématique peut au contraire rendre le code moins explicite. nullptr représente sans ambiguïté un pointeur nul et remplace avantageusement l’utilisation historique de 0 ou NULL, notamment lorsque plusieurs fonctions surchargées peuvent accepter des types différents. La boucle for fondée sur une plage simplifie le parcours des conteneurs : l’élément peut être obtenu par valeur, donc copié, par référence lorsqu’il doit être modifié, ou par référence constante lorsqu’il doit seulement être consulté sans copie inutile. enum class fournit des énumérations fortement typées dont les valeurs restent dans leur propre espace de noms et ne sont pas implicitement converties en entiers, ce qui évite de nombreuses confusions entre valeurs appartenant à des énumérations différentes. constexpr permet quant à lui d’indiquer qu’une valeur ou un calcul peut être évalué dès la compilation lorsque les conditions le permettent ; une fonction constexpr n’est toutefois pas limitée à cet usage et peut également être exécutée normalement pendant l’exécution du programme.
Les structured bindings introduits avec C++17 permettent de décomposer directement un objet contenant plusieurs valeurs en variables distinctes. Ils peuvent notamment être utilisés avec une paire, une structure ou lors du parcours d’une std::map, ce qui évite de manipuler explicitement les différents membres intermédiaires. L’utilisation de références dans cette décomposition permet également d’agir directement sur les éléments originaux au lieu d’en créer des copies. std::optional répond à un autre problème fréquent : représenter proprement une valeur qui peut ne pas exister. Au lieu d’utiliser une valeur conventionnelle comme -1 pour signaler l’échec d’une recherche, une fonction peut retourner un optional contenant soit une valeur valide, soit aucune valeur. La présence d’un résultat peut être testée avant son utilisation ; value() permet d’obtenir la valeur présente et value_or() de fournir une valeur de remplacement lorsqu’elle est absente. std::optional convient ainsi aux situations où l’absence de résultat constitue un cas normal prévu par le programme, tandis qu’une exception correspond davantage à une situation anormale qui interrompt le déroulement habituel. auto, nullptr, les boucles fondées sur une plage, enum class, constexpr, les structured bindings et optional participent tous à une même évolution du langage : exprimer plus directement l’intention du programmeur tout en laissant davantage de vérifications et de mécanismes sûrs au compilateur et à la bibliothèque standard.