C++17
# 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​.
