Pour contribuer à ce document, merci de lire le README.md |
---|
Auteurs | Oliver H, Adrien Jeser, Guillaume Dua, olibre |
---|---|
License | CC BY-SA 4.0 |
URL | https://linuxfr.org/news/nouveautes-au-coeur-du-cpp17 |
Date | 2016-07-22T00:53:12+02:00 |
Tags | c++17, c++ et cpp |
Score | 0 |
Petit rappel, l'ensemble des fonctionnalités std::*
ne s'appelle plus STL (Standard Template Library), mais bibliothèque standard du C++ (C++ Standard Library).
TODO Rappeler l'historique de la STL à la std, Mieux expliquer
- Les algorithmes parallélisés (si multitâche performant) ;
std::string_view
(pour utiliser les méthodes de std::string sur des const char* sans faire de ré-allocation inutile) ;- Les transfuges de chez Boost :
boost::* |
std::* |
---|---|
boost::filesystem |
-> std::filesystem |
boost::variant |
-> std::variant |
boost::any |
-> std::any |
boost::optional |
-> std::optional |
boost::math |
-> fonctions spéciales mathématiques |
Par contre, les fonctionnalités majeures très attendues, comme les intervalles (Ranges) ou le réseau (Networking) seront publiées pour une autre version du C++.
[N4480] optional
, any
, string_view
...
L'énorme TS N4480 intègre de nombreuses fonctionnalités qui n'avaient pas été intégrées à la version C++ mineure C++14. L'intérêt de la plupart de ces fonctionnalités ont été validées par une implémentation sur le projet Boost.
TODO Historique de ce TS, Différences avec Boost, Quelques exemples...
boost::optional
--> std::optional
boost::any
--> std::any
TODO
[func.searchers]
and[alg.search]
[pmr]
std::sample
, sampling from a range?
voir les autres extensions
TODO Découper en plus petites sections
[P0088] std::variant
Ce TS ajoute le std::variant
(type-safe union for C++17) d'après le boost::variant<>
.
union mon_union_peu_sur
{
int i;
char c;
float f;
};
using mon_union_sur = std::variant<int,char,float>;
Certains auraient aimé la possibilité d’interdire un objet std::variant
vide et l'optimisation du std::variant
pour les types légers. TODO Expliquer les raisons.
[P0220] Library Fundamentals TS v1
TODO
[N4169] std::invoke
TODO
[P0077] std::is_callable
TODO
[P0209] std::make_from_tuple
et std::apply
TODO
Ajout de std::filesystem
. Enfin le C++ dispose d'une API standardisée pour gérer fichiers et répertoires !
TODO fournir un exemple
C'est une longue histoire :
- 2003
boost::filesystem
; - 2004 requête pour intégration dans la bibliothèque standard ;
- 2005 première proposition détaillée pour intégration dans la bibliothèque standard ;
- Il aura fallu une dizaine d'années et trois versions majeures pour permettre au groupe d'étude SW3 (Study Group 3) de rédiger l'ultime spécification technique (TS) N4100 (le titre est en français dans le document) qui correspond au standard ISO/IEC TS 18822:2015 ;
- L'implémentation de
std::experimental::filesystem
sur plusieurs plateformes et compilateurs (Visual C++ 2012/2013/2015 et GCC-5.3) a été nécessaire pour décider de l'intégration dans la bibliothèque standard.
Le TS [P0218] propose d'intégrer boost::filesystem
dans C++17 avec quelques différences.
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
and[class.recursive_directory_iterator]
[fs.ops.funcs]
[N4071] Parallelism TS v1
TODO
[N4508] std::shared_mutex
TODO
[P0152] atomic<T>::is_always_lockfree
Ajout de .is_always_lockfree()
.
TODO
[P0154] Ajout hardware_*_interference_size
TODO
[P0156] lock_guard<Mutexes...>
TODO
[N4279] try_emplace
et insert_or_assign
TODO
[N4280] Fonctions globales std::size()
, std::empty()
et std::data()
TODO
[N4284] Contiguous iterator concept
TODO
[N4510] Minimal incomplete type support in containers
TODO
[P0031] Itérateurs constexpr
TODO
[P0083] Splicing for map<>
, unordered_map<>
, set<>
et unordered_set<>
Ce TS Splicing Maps and Sets ajoute des fonctions std::set::splice()
, std::map::splice()
, std::unordered_set::splice()
et std::unordered_map::splice()
comme pour std::list::splice()
.
TODO
[P0084] Les fonctions emplace()
retournent maintenant une référence vers l'objet fraichement créé
TODO
[P0272] Fonction string::data()
non-const
Ajout des fonctions std::string::data()
non-const.
[N4089] Corrections unique_ptr<T[]>
TODO
[N4366] Autres corrections unique_ptr
TODO
[P0033] weak_from_this
TODO
[N4387] Construction {}
pour std::tuple
TODO
[N4277] TriviallyCopyable reference_wrapper, can be performance boost
TODO
Ajout des versions parallélisées de 69 algorithmes (Parallelism TS v1) ;
[N3060] Fonctions spéciales mathématiques
Les fonctions spéciales mathématiques sont discutées au comité de normalisation du C++ depuis plus d'une dizaine d'années. Avec un peu d'archéologie, on retrouve la TS [N1422] qui en parlait déjà en 2003 !
En 2007, ces fonctions étaient déjà dans le wagon de la std
TR1 avec la norme ISO/IEC TR 19768:2007.
Puis en 2010, ces fonctions sont sorties du TR1 pour représenter une norme ISO à part, la norme ISO/IEC 29124:2010.
Et ce n'est que pour 2017, que ces fonctions sont enfin intégrées au C++ !
Mais les matheux pouvaient déjà utiliser boost::math
qui a été l'implémentation de test avant intégration au standard C++.
Son dépôt Git montre une existence depuis 2001 avec une activité importante depuis 2006 (première version livrée).
Ci-dessous un aperçu des domaines mathématiques couverts par cette bibliothèque.
C'est un sacré morceau, et je ne sais pas trop comment les éditeurs de bibliothèque standard C++
vont s'y prendre pour implémenter avec leur droit d'auteur une telle bibliothèque de qualité et performante...
Car si ces éditeurs (GNU, LLVM, Microsoft, Intel...) réutilisent la boost::math
,
alors ils auront à respecter la Boost Software License.
- Polynômes de Laguerre généralisés
- Polynômes associés de Legendre
- Fonction bêta
- Intégrales elliptiques
- Fonctions de Bessel
- Exponentielle intégrale
- Polynôme d'Hermite
- Fonction zêta de Riemann
L'avantage de celle de boost::
est qu'elle est compatible avec une très grande variété de compilateurs, même de très anciens.
Alors qu'une application utilisant celle de std::
requerra un compilateur compatible C++17.
Chère lectrice, cher lecteur LinuxFr.org, as-tu déjà utilisé boost::math
.
Peux-tu partager ton retour d'expérience dans les commentaires ?
Quelles sont tes attentes avec cette intégration dans la std::
?
Penses-tu utiliser un jour la version de la std::
plutôt que celle de boost::
?
[P0025] std::clamp(x,4,8) == std::min(std::max(x,4),8)
Ajout de std::clamp()
.
Exemple pour borner x dans l'intervalle [4, 8] :
// C++14
auto x = std::max(4,std::min(x,8));
// C++17
auto x = std::clamp(x,4,8);
[P0180] Mots-clés std[0-9]+
réservés pour de futures versions de la std::
Ce TS Reserve a New Library Namespace Future Standardization résèrve tous les mots-clés std[0-9]+
pour le nommage d'éventuelles futures versions de la STL bibliothèque standard C++ qui casseraient la rétrocompatibilité.
[P0040] destroy(_at|_n)
, uninitialized_move(_n)
, uninitialized_value_construct(_n)
, uninitialized_default_construct(_n)
Ce TS Extending memory management tools ajoute :
-
destroy(_at|_n)
-
uninitialized_move(_n)
-
uninitialized_value_construct(_n)
-
uninitialized_default_construct(_n)
TODO liens vers cppref + explications
[N3911] std::void_t<T>
TODO
[N4258] Fonctions noexcept
pour std::*
TODO
[N4259] std::uncaught_exceptions
TODO
[N4389] std::bool_constant
TODO
[P0005] std::not_fn
TODO
[P0006] Les variables *_v
pour SFINAE
TODO
[P0007] std::as_const
TODO
[P0013] std::conjunction
, std::disjunction
et std::negation
TODO
[P0074] std::owner_less<void>
comme std::less<void>
mais pour les smart pointers
Cela sert à trier les smart pointers indépendament de l'objet contenu.
[P0092] Corrections pour std::chrono
TODO
[P0067] std::to_chars
et std::from_chars
Des fonctions de conversion ASCII <-> nombres haute performance ignorant les locales. Enfin, plus besoin de réinventer la roue pour les nombreuses bibliothèques qui sérialisent/désérialisent entre les formats lisibles aux humains (HTML/XML/JSON/YAML...) et les formats binaires lisibles par la machine.
[P0137] std::launder
TODO
[P0258] std::is_contiguous_layout
(pour le hashage)
TODO
[N4190] auto_ptr
, old <functional>
stuff, random_shuffle
TODO
[P0004] ios aliases
TODO
[P0181] Suppression de std::default_order
(indirection vers std::less
)
Cela cassait l'ABI de certains compilateurs à cause du mangling
[P0302] Allocateurs des std::function
TODO
Quatre gros morceaux ont été inclus dans C++17 :
- le parallélisme avec les 69 algorithmes parallélisées ;
- le
std::filesystem
; - les autres transfuges de boost (optional, any, string_view, variant...) ;
- les fonctions spéciales mathématiques.
Par contre, les fonctionnalités suivantes n’ont pas été considérées comme suffisamment mures pour être incluses :
- Coroutines ;
- Réseau (Networking) ;
- Tableaux (Array). Une idée de 2013, mais finalement abandonnée ;
- Ranges ;
- Mémoire transactionnelle (Transactional Memory) ;
- et autres extensions majeures de la bibliothèque standard.
Le comité attend de voir des implémentations satisfaisantes dans les compilateurs avant de les inclure...
Même si C++17 va un peu plus transcender notre façon de coder en C++, de nombreux développeurs s’attendaient à une version majeure (révolutionnaire). Par rapport à C++11, les apports du C++17 ressemblent plus à une version mineure.