Le comité a conclu une entente et la liste des fonctionnalités ne changera plus. Voici la liste des fonctionnalités qui intègreront C++17 :
- allocation dynamique de mémoire pour les données sur alignées : en effet, depuis C++11, vous pouviez spécifier l'alignement d'une structure avec alignas(). Toutefois, lors d'une allocation dynamique, il fallait vous-même gérer la taille de la mémoire alignée tout en prenant en compte, manuellement, l'alignement ;
- déduction des arguments de template pour les classes templates ;
- mot clé auto pour les templates : permet de définir le type utilisé dans un template au moment de l'instanciation du template ;
- garantie sur l'omission de la copie : notamment pour permettre à une fonction de renvoyer un objet impossible à déplacer (et aussi, de ne pas avoir à toujours définir le constructeur de copie et de déplacement lorsqu'ils ne sont pas du tout utilisés) ;
- une version affaiblie de l'ordre d'évaluation fixe pour les expressions : pour enlever toute ambiguïté sur un code tel que f(i++,i) ;
- contexpr if : condition traitée lors de la compilation ;
- garantie forward progress : amélioration de la formulation du standard ;
- variables inline ;
- liaisons structurées ;
- if et switch (regroupement de l'initiation et de la condition) : nouvelle syntaxe pour le mot clé if, permettant d'écrire if (status_code err = fct(); err != SUCCESS).
Du côté des fonctionnalités la bibliothèque standard, les quatre points suivants ont été acceptés :
- le C++17 repose sur C11 et non pas C98 ;
- variant<> : union avec protection du type ;
- destroy(_at|_n), uninitialized_move(_n), uninitialized_value_construct(_n), uninitialized_default_construct(_n) ;
- déplacement d'éléments pour map<>,unordered_map<>, set<>, and unordered_set<> ;
- réservation de std[0-9]+ pour les standards futurs.
Pour rappel, il y a trois mois (lors de la réunion précédente), le comité s'était accordé pour intégrer les fonctionnalités suivantes :
- attributs [[fallthrough]], [[nodiscard]], [[maybe_unused]] ;
- constexpr lambdas ;
- généralisation des boucles sur ensemble ;
- capture de *this dans les lambdas ;
- valeurs littérales hexadécimales pour les nombres à virgules flottantes ;
Et pour la bibliothèque standard :
- (parts of) Library Fundamentals TS v1 ;
- Parallelism TS v1 ;
- File System TS v1 ;
- fonctions mathématiques spéciales ;
- hardware_*_interference_size ;
- .is_always_lockfree() ;
- clamp() ;
- non-const .data() pour les chaînes de caractères.
Comme nous l'avions vu, les concepts ne feront pas partie du C++17. Vous pouvez voir la liste complète des fonctionnalités ici.
Évidemment, une nouvelle version du langage n'est rien si les compilateurs ne la supportent pas. On pourra donc se renseigner sur le progrès du support pour clang ici et pour libc++ ici.
Votre opinion
Avez-vous suivi les évolutions du C++17 ? Qu'est-ce qui vous intéresse le plus dans les nouvelles fonctionnalités ?
Envisagez-vous de l'intégrer dans vos projets au plus tôt ? Comment gérez-vous une transition ?
Source
Page IsoCPP sur les fonctionnalités du langage