Le standard C++17 est officialisé

Par:
fredericmazue

ven, 08/12/2017 - 13:03

Depuis le moi de mai de cette année, la norme C++17 du langage C++ était complète. Son officialisation était attendue pour la fin de cette année. C'est désormais chose faite. La nouvelle norme s'appelle SO/IEC 14882:2017. Elle est disponible sur iso.org.

C++17, pendant un temps appelé C++1z, est une évolution majeure du langage, comme l'ont été C++11 et C++98 en leur temps.

C++17 veut faire de C++ un langage moins lourd, plus facile à manier dans certaines situations, et plus moderne. Pour prendre un exemple, la nouvelle construction if-constexpr permet d'éviter de se lancer dans la grosse meta-programmation à base de templates.

Avant, pour obtenir le nième élément d'une liste variadique générique, il fallait écrire ceci.

template<unsigned n>
                           struct Arg {
                            template<class X, class...Xs>
                            constexpr auto operator()(X x, Xs...xs) {
                              return Arg<n - 1>{}(xs...);
                            }
                           };                          

template<>
                           struct Arg<0> {
                            template<class X, class...Xs>
                            constexpr auto operator()(X x, Xs...) {
                              return x;
                            }
                           };

                          

template<unsigned n>                       
                           constexpr auto arg = Arg<n>{};                          

// arg<2>(0, 1, 2, 3, 4, 5) == 2

Avec C++17, le code devient :

template<unsigned n>
                           struct Get {
                            template<class X, class…Xs>
                            constexpr auto operator()(X x, Xs…xs) {
                              if constexpr(n > sizeof…(xs) ) {
                                return;
                              } else if constexpr(n > 0) {

                                return Get<n-1>{}(xs…);
                              } else {

                                return x;
                              }
                            }
                           };

C++17 apporte de nouvelles fonctionnalités très intéressantes. Par exemple le support des caractères littéraux au format Unicode 8 bits, les variables inline, les expressions de réductions (fold expressions), les liaisons structurées (structured bindings) la parallélisation des algorithmes de la bibliothèque standard STL, etc.

La liste des nouveautés du langage peut être consultée ici.

Côté compilateur, GCC et LLVM/Clang offrent déjà un support complet de C++17. Microsoft travaille activement à la prise en charge du nouveau standard dans Visual Studio 2017, donc la version 15.5 en supporte déjà une grande partie.