title: C++17
text: # C++17
  
  C++17, anciennement connu sous le nom de C++1z, est une norme pour le langage de programmation C++. Elle a été publiée en décembre 2017 sous le nom de ISO/CEI 14882:2017.
  
  Le dernier working draft gratuit est le N4659, qui date du 21 mars 2017, les seules différences avec le standard étant des corrections éditoriales.
  
  ## Suppression
  
  Cette version de C++ a non seulement ajouté de nouvelles fonctionnalités, mais en a également supprimé quelques-unes.
  
  * Suppression des $trigrammes^,.$
  * Suppression de certains types et fonctions obsolètes de la bibliothèque standard, notamment std::auto_ptr​, std::random_shuffle​ et les anciens adaptateurs de $fonction^,.$ Celles-ci ont été remplacées dans C++11 par des fonctionnalités améliorées telles que std::unique_ptr​, std::shuffle​, std::bind​ et lambdas.
  * Suppression de l'utilisation (anciennement obsolète) du mot clé register​ en tant que spécificateur de classe de stockage. Ce mot-clé reste réservé.
  
  ## Nouvelles fonctionnalités
  
  ### Langage
  
  * Le message de static_assert​ est facultatif.
  * Utilisation possible de typename​ (comme alternative à class​) pour les paramètres de template template​.
  * Nouvelles règles de déduction des braced-init-list avec $auto​^,.$
  * Définitions d'espace de noms imbriquées : namespace X::Y { … }​ au lieu de namespace X { namespace Y { … } $}​^,.$
  * Utilisation d'attributs sur les espaces de noms et les énumérateurs.
  * Nouveaux attributs standards [[fallthrough]]​, [[maybe_unused]]​ et [[nodiscard]]​.
  * Caractères littéraux UTF-8 (u8​) (les chaines littérales UTF-8 existent depuis C++11).
  * Littéraux hexadécimaux à virgule flottante.
  * Utilisation de auto​ pour les non-type template parameter.
  * Évaluation constante des arguments des non-type template parameter.
  * fold expression pour les variadic template.
  * if​ statique évalué à la compilation : if constexpr(expression)​.
  * Déclarations structured binding : auto [a, b] = getTwoReturnValues;​.
  * Initialiseurs dans les instructions if​ et switch​.
  * L'initialisation par copie et l'initialisation directe d'objets de type T​ partir de prvalue​ de type T​ (en ignorant les qualificatifs cv) n'entraîne l'appel d'aucun constructeur de copie ni de déplacement à partir de l'expression prvalue​ (élision de copie).
  * Déduction des arguments des classes templates disponibles pour les $constructeurs^,.$ Autorisant l'écriture std::pair(5.0, false)​ au lieu d'exiger la fourniture explicite des types des arguments du constructeur std::pair<double, bool>(5.0, false)​ ou une fonction de construction intermédiaire std::make_pair(5.0, false)​.
  * Variables inline​ permettant la définition de variables dans les fichiers d'en-tête sans enfreindre la règle de définition unique (les règles sont similaires à celle des fonctions inline​).
  * __has_include​ permettant de vérifier la disponibilité d'un en-tête par les directives du préprocesseur.
  * La valeur de __cplusplus​ est changée en 201703L​.
  * Les spécifications d'exception ont été intégrées à la signature des fonctions.
  * Les expressions lambda peuvent capturer *this​ par valeur.
  
  ### Bibliothèque
  
  * La majorité de Library Fundamentals V1 TS, y compris :
     * std::string_view​ : référence non propriétaire en lecture seule sur une séquence de caractères ou une sous-chaîne de caractères.
     * std::optional​ : représentation d'objets facultatifs.
     * std::any​ pour contenir des valeurs uniques de tout type.
  * std::uncaught_exceptions​ en remplacement de std::uncaught_exception<​ dans la gestion des exceptions.
  * Nouvelles fonctions d'insertion try_emplace​ et insert_or_assign​ pour les structures de données associatives std::map​ et std::unordered_map​.
  * Fonctions libres d'accès uniforme au conteneur std::size​, std::empty​ et std::data​.
  * Définition des « itérateurs contigus ».
  * Bibliothèque de système de fichiers basée sur boost::filesystem​.
  * Versions parallèles de plusieurs algorithmes STL.
  * Fonctions spéciales mathématiques supplémentaires, y compris les intégrales elliptiques et les fonctions de Bessel.
  * std::variant​ : un type somme.
  * std::byte​ : type représentant un multiplet de données comme un multiplet plutôt qu'un caractère.
  * Traits modélisant les opérateurs logiques : std::conjunction​, std::disjunction​ et std::negation​.
  