URL: https://linuxfr.org/news/nous-avons-lu-pour-vous-embracing-modern-c-safely Title: Nous avons lu pour vous : Embracing Modern C++ Safely Authors: Julien Jorge small_duck, Lawless, alkino, pulkomandy, serge_sans_paille et Ysabeau đ§¶ Date: 2022ćčŽ08æ19æ„T18:26:32+02:00 License: CC By-SA Tags: c++14, c++, livre_technique et c++11 Score: 27 _Embracing Modern C++ Safely_ par John Lakos, Vittorio Romeo, Rostislav Khlebnikov, et Alisdair Meredith, est un livre couvrant les nouveautĂ©s apportĂ©es au langage C++ dans ses versions 11 et 14. Les auteurs sont tous employĂ©s de Bloomberg et prĂ©sentent chaque addition au langage sous couvert de lâexpĂ©rience quâils en ont eu au quotidien dans leur mĂ©tier. ---- [La page officielle du livre.](https://emcpps.com) [Une prĂ©sentation du livre par Vittorio Romeo - CppCon21](https://www.youtube.com/watch?v=6-1LNGWgy1o) ---- # PrĂ©sentation des auteurs John Lakos travaille depuis 20 ans chez Bloomberg, en tant que chef dâune division qui dĂ©veloppe des composants C++ de base utilisĂ©s en interne. Il participe rĂ©guliĂšrement Ă des confĂ©rences sur le C++, et fait partie du comitĂ© de normalisation du C++. Vittorio Romeo, Rostislav Khlebnikov, et Alisdair Meredith sont tous trois dĂ©veloppeurs senior chez Bloomberg. Le premier sâinvestit Ă©normĂ©ment dans la communication autour du C++ et fait de nombreuses prĂ©sentations trĂšs pĂ©dagogiques sur ce sujet. On en trouvera des enregistrements sur [sa page YouTube](https://www.youtube.com/channel/UC1XihgHdkNOQd5IBHnIZWbA). John Lakos, Vittorio Romeo et Alisdair Meridith sont aussi auteurs ou co-auteurs de nombreuses propositions soumises au comitĂ© dĂ©cidant des Ă©volutions du standard C++. Bloomberg est une gigantesque multinationale de la finance de 15 000 employĂ©s, spĂ©cialisĂ©e dans la centralisation et la publication de donnĂ©es financiĂšres, comme les cours de bourse, les nouvelles financiĂšres, les informations sur les entreprises. Leur produit phare est le « terminal Bloomberg », autrefois du matĂ©riel spĂ©cialisĂ© mais aujourdâhui une simple application qui tourne sur un PC, et qui ressemble furieusement Ă un super-minitel. Bloomberg est donc connectĂ© Ă la grande majoritĂ© des places financiĂšres de la planĂšte, et redistribue les donnĂ©es en temps rĂ©el ou permet des requĂȘtes historiques. Ils sont connus dans le mĂ©tier pour avoir une Ă©norme base de code en C++. Ils sont Ă©galement connus dans le mĂ©tier pour avoir une base de code plutĂŽt ancienne avec beaucoup de code pas franchement Ă la pointe de la modernitĂ©, ce qui explique certainement lâintĂ©rĂȘt de nos quatre auteurs Ă soutenir les bonnes pratiques et Ă Ă©vangĂ©liser une approche moderne et sĂ»re. # Pourquoi un livre sur C++14 en 2021? Les standards C++11 et 14 ne sont plus tout rĂ©cents, les versions 17 et 20 sont dĂ©jĂ disponibles. Cependant, lâobjectif de ce livre est de fournir un retour dâexpĂ©rience aprĂšs avoir vraiment pratiquĂ© la programmation C++ avec ces fonctionnalitĂ©s en long, en large et en travers. Cela a donc nĂ©cessitĂ© lâimplĂ©mentation des fonctionnalitĂ©s dans un compilateur, le dĂ©ploiement de ce compilateur dans un environnement de production, puis encore quelque temps pour la prise en main et lâutilisation des fonctionnalitĂ©s et la dĂ©couverte des problĂšmes qui peuvent survenir lors dâune utilisation rĂ©elle, hors dâexemples souvent simplistes fournis dans la documentation existante. # Contenu du livre [Andrei Alexandrescu](https://fr.wikipedia.org/wiki/Andrei_Alexandrescu), auteur de nombreux livres sur le C++, lâexplique trĂšs bien dans la prĂ©face : ce livre est avant tout un diff du C++98 avec le C++14. Ce nâest donc ni un tutoriel, ni un recueil des meilleures pratiques de programmation, et il contient finalement assez peu de conseils. Au lieu de cela, câest un inventaire exhaustif des nouvelles fonctionnalitĂ©s du langage, expliquĂ©es et dĂ©cortiquĂ©es, en particulier Ă travers le prisme de la sĂ©curitĂ©. Pour chaque fonctionnalitĂ©, le livre explique en dĂ©tail son fonctionnement, puis fournit des cas courants dâutilisation, les erreurs Ă Ă©viter, et enfin les cas particuliers gĂȘnants Ă connaĂźtre. Parfois, une annexe est ajoutĂ©e Ă la fin de la section pour dĂ©crire un concept plus en dĂ©tail. Il ne sâagit donc pas dâun livre pour apprendre le C++, il sâadresse plutĂŽt aux personnes qui connaissent dĂ©jĂ le langage. Par exemple, il peut servir de rĂ©fĂ©rence Ă quelquâun qui devrait rĂ©diger des rĂšgles de style pour une entreprise et dĂ©cider de la « bonne » façon dâutiliser ou pas ces fonctionnalitĂ©s. Les auteurs ont constatĂ© que les rĂšgles appliquĂ©es chez Bloomberg ou dans dâautres entreprises Ă©taient parfois arbitraires, basĂ©es sur les prĂ©fĂ©rences personnelles de la personne qui les a rĂ©digĂ©es, oĂč parfois basĂ©es sur des problĂšmes obsolĂštes (bug dans une ancienne version dâun compilateur). Avec ce livre, on dispose de toutes les raisons pour ou contre lâutilisation de chaque fonctionnalitĂ© du langage, ce qui permet dâĂ©tablir des rĂšgles Ă partir de critĂšres moins subjectifs. Le livre est Ă©norme. Pas loin de 1 400 pages pour 18,5 Ăă°ă€ 23 Ăă°ă€ 5 cm ; il pĂšse plus de deux kilos. LâintĂ©rieur est aĂ©rĂ©, bien lisible, et les exemples de code sont bien intĂ©grĂ©s et lĂ©gers. Le contenu du livre est organisĂ© dâune maniĂšre ingĂ©nieuse, en trois grandes parties regroupant chacune des fonctionnalitĂ©s du langage considĂ©rĂ©es sĂ»res, variablement sĂ»res, et risquĂ©es. Il faut entendre le terme « sĂ»r » comme une indication de la rĂ©ponse Ă la question « si jâutilise la fonctionnalitĂ© X, risquerai-je dâavoir de mauvaises surprises ? ». Les mauvaises surprises pouvant aller de « le code est plus compliquĂ© Ă maintenir » à « certains cas sont _undefined behavior_ ou crashent ». Lâun des auteurs (Romeo) propose Ă©galement dâutiliser cette classification pour enseigner le C++. Les deux premiĂšres catĂ©gories peuvent ĂȘtre expliquĂ©es dans une formation de base sur C++ : la premiĂšre sans conditions, la deuxiĂšme en prenant soin dâexpliquer oĂč se trouvent les piĂšges potentiels. Les fonctionnalitĂ©s rangĂ©es dans la troisiĂšme catĂ©gorie seront Ă rĂ©server Ă des besoins trĂšs spĂ©cifiques, Ă des programmeurs plus expĂ©rimentĂ©s, et mĂ©ritent chacune une formation ou un atelier spĂ©cifique pour bien les comprendre et les utiliser correctement. La section des fonctionnalitĂ©s sĂ»res liste : les [attributs](https://en.cppreference.com/w/cpp/language/attributes) â [les `>` consĂ©cutifs](https://en.cppreference.com/w/cpp/language/angle_bracket_hack) â [`decltype`](https://en.cppreference.com/w/cpp/language/decltype) â les fonctions marquĂ©es [`default`](https://en.cppreference.com/w/cpp/language/function#Function_definition) â [la dĂ©lĂ©gation de constructeurs](https://en.cppreference.com/w/cpp/language/constructor#Delegating_constructor) â les fonctions marquĂ©es [`delete`](https://en.cppreference.com/w/cpp/language/function#Function_definition) â les opĂ©rateurs [`explicit`](https://en.cppreference.com/w/cpp/language/cast_operator) â lâutilisation de [`static`](https://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables) dans une fonction â les types anonymes ou locaux en paramĂštres template â le type [`long long`](https://en.cppreference.com/w/cpp/language/types#long_long) â lâattribut [`[[noreturn]]`](https://en.cppreference.com/w/cpp/language/attributes/noreturn) â [`nullptr`](https://en.cppreference.com/w/cpp/language/nullptr) â [`override`](https://en.cppreference.com/w/cpp/language/override) â les [chaĂźnes brutes](https://en.cppreference.com/w/cpp/language/string_literal) â [`static_assert`](https://en.cppreference.com/w/cpp/language/static_assert) â le [type de retour en fin de signature de fonction](https://en.cppreference.com/w/cpp/language/function) â les [littĂ©raux unicode](https://en.cppreference.com/w/cpp/language/string_literal) â [`using`](https://en.cppreference.com/w/cpp/language/type_alias) en tant quâalias de type â l'[initialisation de types agrĂ©gĂ©s](https://en.cppreference.com/w/cpp/language/aggregate_initialization) â les [littĂ©raux binaires](https://en.cppreference.com/w/cpp/language/integer_literal) avec `0b` â lâattribut [`[[deprecated]]`](https://en.cppreference.com/w/cpp/language/attributes/deprecated) â le [sĂ©parateur de chiffres](https://en.cppreference.com/w/cpp/language/integer_literal) `'` â les [variables template](https://en.cppreference.com/w/cpp/language/variable_template). Dans partie des fonctionnalitĂ©s conditionnellement sĂ»res on trouvera : [`alignas`](https://en.cppreference.com/w/cpp/language/alignas) â [`alignof`](https://en.cppreference.com/w/cpp/language/alignof) â les variables [`auto`](https://en.cppreference.com/w/cpp/language/auto) â lâinitialisation avec des accolades â les fonctions ou variables [`constexpr`](https://en.cppreference.com/w/cpp/language/constexpr) â la valeur d'[initialisation par dĂ©faut des membres](https://en.cppreference.com/w/cpp/language/data_members#Member_initialization) de classes et d'unions â [`enum class`](https://en.cppreference.com/w/cpp/language/enum#Scoped_enumerations) â [`extern template`](https://en.cppreference.com/w/cpp/language/class_template#Explicit_instantiation) â les [_forwarding references_](https://en.cppreference.com/w/cpp/language/reference#Forwarding_references) â les POD gĂ©nĂ©ralisĂ©s â l'[hĂ©ritage de constructeurs](https://en.cppreference.com/w/cpp/language/using_declaration#In_class_definition) â [`std::initializer_list`](https://en.cppreference.com/w/cpp/utility/initializer_list) â les [lambdas](https://en.cppreference.com/w/cpp/language/lambda) â l'[opĂ©rateur `noexcept`](https://en.cppreference.com/w/cpp/language/noexcept) â les enumĂ©rations opaques â [_range_ `for`](https://en.cppreference.com/w/cpp/language/range-for) â [`std::move`](https://en.cppreference.com/w/cpp/utility/move) et les [rĂ©fĂ©rences aux rvalues](https://en.cppreference.com/w/cpp/language/reference#Rvalue_references) â la dĂ©finition du [type sous-jacent](https://en.cppreference.com/w/cpp/types/underlying_type) aux Ă©numĂ©rations â les [littĂ©raux dĂ©finis par lâutilisateur](https://en.cppreference.com/w/cpp/language/user_literal) â les [templates variadiques](https://en.cppreference.com/w/cpp/language/parameter_pack). Enfin la section des fonctionnalitĂ©s risquĂ©es liste : lâattribut [`[[carries_dependency]]`](https://en.cppreference.com/w/cpp/language/attributes/carries_dependency) â [`final`](https://en.cppreference.com/w/cpp/language/final) â les dĂ©clarations [`friend` Ă©tendues](https://en.cppreference.com/w/cpp/language/friend) â [`inline namespace`](https://en.cppreference.com/w/cpp/language/namespace#Inline_namespaces) â le spĂ©cificateur [`noexcept`](https://en.cppreference.com/w/cpp/language/noexcept_spec) â les fonctions membres marquĂ©es de [`&` ou `&&`](https://en.cppreference.com/w/cpp/language/member_functions#member_functions_with_ref-qualifier) â les [unions avec des types non triviaux](https://en.cppreference.com/w/cpp/language/union) â la [dĂ©duction automatique](https://en.cppreference.com/w/cpp/language/function#Return_type_deduction) du type de retour dâune fonction â [`decltype(auto)`](https://en.cppreference.com/w/cpp/language/auto). Les lecteurs attentifs auront remarquĂ© que ces listes concernent uniquement le langage C++ Ă proprement parler. Le livre nâaborde pas les nombreux changements dans la STL, la bibliothĂšque standard de fonctions qui fait Ă©galement partie de la spĂ©cification du C++. Ă lâheure oĂč jâĂ©cris ces lignes, jâai lu environ la moitiĂ© du livre. Chaque fonctionnalitĂ© est soigneusement prĂ©sentĂ©e, suivie de cas typiques dâutilisation. Puis viennent les piĂšges Ă©ventuels et les situations ennuyeuses ou gĂȘnantes. Par exemple, pour prendre un cas sĂ»r, lâutilisation du mot-clĂ© `static` dans la dĂ©claration dâune variable locale Ă une fonction garantit que lâinitialisation sera faite de maniĂšre atomique depuis C++11. Voici un extrait tirĂ© du livre : ```c++ Logger& getLogger() { // MĂȘme si deux threads appellent getLogger() simultanĂ©ment, local est bien // initialisĂ© une seule fois. static Logger local("log.txt"); return local; } ``` Pour illustrer un potentiel piĂšge, considĂ©rons maintenant ce cas dâutilisation de `getLogger()`: ```c++ struct FileManager { FileManager() { getLogger() << "DĂ©marrage du gestionnaire de fichiers..."; // ... } ~FileManager() { getLogger() << "Extinction du gestionaire de fichiers..."; // ... } }; FileManager& getFileManager() { static FileManager fileManager; return fileManager; } ``` L'ordre des premiers appels Ă `getFileManager()` et `getLogger()` n'a pas d'importance. Si le premier est appelĂ© avant le second, il dĂ©clenchera la crĂ©ation du logger, sinon le logger aura dĂ©jĂ Ă©tĂ© créé. Par contre, l'ordre de destruction est important (notez que l'ordre de destruction est forcĂ©ment l'inverse de l'ordre de crĂ©ation). - si `FileManager` est dĂ©truit en premier, tout se passe bien. - autrement, le comportement du programme est non spĂ©cifiĂ© (_undefined behavior_) car le destructeur de `FileManager` va appeler `getLogger()` qui va retourner une rĂ©fĂ©rence vers un objet qui nâexiste plus. Note de votre serviteur : ici le souci est liĂ© Ă lâutilisation dâune variable statique dans les fonctions et non pas liĂ© spĂ©cifiquement aux ajouts de C++11. Au niveau des gĂȘnes, les auteurs notent Ă juste titre que dans le cas dâune fonction utilisĂ©e dans un contexte mono-thread, lâinitialisation dâune variable locale `static` sera quand mĂȘme inutilement gardĂ©e par des primitives de synchronisation, et lâappel ne pourra ĂȘtre `inline` (Notons que lâoption `-fno-threadsafe-statics` permet de contrĂŽler cet aspect avec GCC et Clang). Du cĂŽtĂ© des fonctionnalitĂ©s sans inconvĂ©nient, on peut noter `nullptr` qui nâa aucun piĂšge ni ne provoque de surprise, ou encore `override`, qui amĂ©liore grandement la qualitĂ© du code et aide Ă Ă©viter de nombreuses erreurs, sans quâil soit vraiment possible de se tromper. Enfin, sâagissant dâune premiĂšre Ă©dition, le livre contient quelques menues erreurs ici et lĂ , bĂ©nignes et qui seront sans doute remarquĂ©es par les habituĂ©s du langage. Elles pourront cependant perturber les autres lecteurs ; pour ces derniers, il vaut sans doute mieux attendre la seconde Ă©dition avant dâaborder ce livre. # Commentaires du lecteur ## Commentaires de Julien Jorge Cet ouvrage est un peu comme [le livre que jâĂ©cris](https://github.com/j-jorge/counting-in-cpp) mais rĂ©digĂ© en plus dĂ©taillĂ©, mieux renseignĂ©, et beaucoup plus neutre, par des gens qui en savent bien plus que moi. Câest un peu frustrant, mais je suis content quâEmbracing Modern C++ Safely existe :) Je considĂšre que câest un trĂšs bon achat et je vous recommande de lâacquĂ©rir, que ce soit pour vous mettre Ă jour si vous nâutilisez pas encore ou Ă peine C++11, ou bien pour profiter de lâexpĂ©rience de gens trĂšs qualifiĂ©s si vous voulez optimiser votre utilisation du langage. Chaque section est trĂšs complĂšte et les avantages et inconvĂ©nients sont bien expliquĂ©s, avec des exemples simples. On pourra reprocher au livre dâĂȘtre un peu trop verbeux. Il nâest pas rare de lire une information, puis de la relire sous forme de code et commentaire, puis de la lire encore une fois deux pages plus loin. Le fait que le livre ait autant de pages que le standard C++14 est dĂ©jĂ un indicateur. Cela dit, je vous conseille de lire ce livre plutĂŽt que le standard. Il faut noter que le livre ne couvre que les additions au langage et nâaborde pas la bibliothĂšque standard. Cette verbositĂ© est cependant un avantage pour le lecteur qui souhaite piocher dans le livre dans le dĂ©sordre. En effet, chaque section est indĂ©pendante et peut ĂȘtre abordĂ©e directement. Je note lâintention des auteurs dâĂȘtre factuels et dâĂ©viter tout forme dâopinion. Câest tout Ă fait rĂ©ussi. Par exemple, dans les piĂšges potentiels et autres gĂȘnes, les situations sont listĂ©es simplement sans indiquer de gravitĂ© absolue ni mĂȘme relative des uns par rapport aux autres. Certains de ces exemples me semblent parfois tirĂ©s par les cheveux et il mâarrive de me demander « mais qui irait faire ça ? » devant certains codes. NĂ©anmoins, puisque les auteurs souhaitent prĂ©senter des faits, il est bien vu de leur part de prĂ©senter tous ces exemples sans discrimination. ## Commentaires de small_duck - Un ouvrage intĂ©ressant, mais un peu tardif ? ## Je ne peux quâapplaudir lâeffort et lâexhaustivitĂ© de lâouvrage, qui reprend en dĂ©tail chaque nouvelle fonctionnalitĂ©, ce que jâavais tentĂ© de faire Ă mon humble niveau dans la section C++ de mon [blog](http://aubedesheros.blogspot.com/search/label/cpp). Les sections de cas dâutilisation sont certainement celles que je trouve les plus intĂ©ressantes : une nouvelle fonctionnalitĂ©, dâaccord, mais Ă quoi ça sert, et pourquoi ? Les explications sont donc trĂšs claires, mĂȘme si jâaurais justement prĂ©fĂ©rĂ© que ces sections prennent le pas sur les risques, qui Ă mon avis prennent trop de place dans le bouquin. Quelques conseils auraient Ă©tĂ© les bienvenus: les auteurs se bornent trop souvent Ă indiquer que « nous ne recommandons pas particuliĂšrement cette fonctionnalitĂ©, juste indiquons son existence. » La question se pose tout de mĂȘme : en 2022, Ă qui sâadresse le livre ? Ă des dĂ©veloppeurs et des dĂ©veloppeuses chevronnĂ©s, trĂšs Ă la pointe dans le C++ 98, mais qui nâauraient pas ou peu fait de C++11/14 ? Avec la myriade de tutoriels, pages StackOverflow ou encore les derniĂšres pages [Guru of the week](https://herbsutter.com/gotw/) dâHerb Sutter, quels sont les dĂ©veloppeurs ou les dĂ©veloppeuses qui ont attendu ce livre pour migrer leur base de code ? Aujourdâhui, quelquâun cherchant un ouvrage sur le C++ moderne pourrait plutĂŽt se laisser tenter par un livre qui irait jusquâau dernier standard, peut-ĂȘtre en laissant de cĂŽtĂ© les fonctionnalitĂ©s les plus obscures, avec des Ă©lĂ©ments de bibliothĂšque standard, peut-ĂȘtre dans une approche moins scolaire et plus prescriptive. Jây trouve cependant mon bonheur, en partant du dĂ©but du livre et en lisant petit Ă petit, pour rĂ©viser mes fonctionnalitĂ©s, apprendre de nouvelles techniques que je pourrais utiliser dans mes bases de code, ou mâassurer que je les utilise correctement. # OĂč trouver le livre Plusieurs librairies proposent le livre. On trouvera une liste sur [le site officiel](https://emcpps.com). Il vous en coĂ»tera une cinquantaine dâeuros pour lâacquĂ©rir.