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.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /