URL: https://linuxfr.org/news/c-17-adapte-le-static_assert-aux-usages Title: C++17 adapte le static_assert() aux usages Authors: Adrien Jeser Oliver, Bruno Michel, Benoît Sibaud et palm123 Date: 2016年11月25日T17:06:15+01:00 License: CC By-SA Tags: programmation, langage_c, c++17, c++ et c Score: 24 [![Un développeur annonce "C'est fini, Compilé c'est testé, Linké c'est livré. Face à son chef dubitatif, il ajoute "Le code est constexpr et les tests sont static_assert()"](http://cpp-frug.github.io/materials/images/compiler-c-est-tester_copyright-OliverH-2016_CC-BY-SA-3.0_original.png "Compilé c'est Testé Linké c'est Livré Et oui c'est possible grâce au C++ ")](https://github.com/cpp-frug/materials/blob/gh-pages/images/README.md#compil%C3%A9-cest-test%C3%A9) ---- ---- Spécification technique ======================= Le TS [[N3928]](https://wg21.link/n3928) permet d'utiliser le `static_assert(expr)` avec un seul paramètre. Avant il fallait fournir un second : le paramètre `message`. Changement =================== C++17 permet d'écrire `static_assert(condition)` avec un seul paramètre. Avant, seule la fonction [`static_assert(condition, message)`](http://fr.cppreference.com/w/cpp/language/static_assert) était disponible avec le second paramètre `message` obligatoire. ```cpp // Les static_assert avec un message vide étaient courants static_assert(sizeof(int) == 4, ""); // L'usage (mauvaise pratique?) a influencé C++17 static_assert(sizeof(int) == 4); ``` Renommer en `constexpr_assert()` ? ================================== Pour l’anecdote, cette fonctionnalité aurait bien pu s'appeler `constexpr_assert()` car `constexpr` exprime qui est évalué lors de la compilation. Donc `constexpr` est plus précis que `static` dans le nom `constexpr_assert()`. La fonctionnalité `static_if` s'est bien fait renommer `constexpr_if` (voir l'historique de P0292). Compilé c'est testé, linké c'est livré ====================================== Soulignons que les [mots-clés](http://en.cppreference.com/w/cpp/keyword) `constexpr` et `static_assert()` permettent au C++ de réaliser l'adage *"Compilé c'est testé, linké c'est livré"* comme illustré par le [comic strip](https://fr.wikipedia.org/wiki/Comic_strip) ci-dessous. [![Un développeur annonce à son responsable "Compilé c'est Testé, Linké c'est Livré" puis explique que le code C++ est constexpr et les tests sont static_assert()](https://cpp-frug.github.io/materials/images/compiler-c-est-tester_copyright-OliverH-2016_CC-BY-SA-3.0.svg)](https://github.com/cpp-frug/materials/blob/gh-pages/images/README.md#compil%C3%A9-cest-test%C3%A9) Comment faisait-on avant ? ========================== Profitons de cette petite dépêche pour parler un peu de méta-programmation. Progressivement, dans les années 1990, quelques développeurs commençaient à ~~utiliser~~ détourner le mot-clé `template` pour avoir des `assert()` à la compilation. Initialement, le `template` avait été conçu pour la programmation générique, et le voilà propulsé pour ce qui deviendra quelques années plus tard la méta-programmation. ```cpp template class Assert; template class Assert
{}; ``` La classe `template Assert` n'est définie que pour la spécialisation `
`. La spécialisation `` est volontairement non définie pour pousser le compilateur à afficher une erreur si utilisée. Si le code source utilise `Assert`, le compilateur affiche l'erreur suivante : * `implicit instantiation of undefined template 'Assert'` pour Clang entre la v3.3 et la v3.9 ; * `aggregate 'Assert Nom_de_la_variable' has incomplete type and cannot be defined` pour GCC entre la v4.4 et la v7. Pour t'exercer, tu peux jouer avec ces deux exemples disponibles sur [godbolt.org](https://godbolt.org/g/6pDk58) : ```cpp int melange (int n) { Assert La_fonction_melange_ne_gere_que_les_entiers_sur_4_octets; return (n<<16) + ((n<<8) & 0xF0) + (n>>16); } ``` ```cpp struct S { float f; int i; bool b; char c; short s; }; Assert La_structure_S_ne_doit_pas_avoir_de_padding; ```

AltStyle によって変換されたページ (->オリジナル) /