# 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.