Skip to content

Latest commit

 

History

History
565 lines (291 loc) · 19.7 KB

2016_n4_Cpp17_Nouveautes-de-la-bibliotheque.md

File metadata and controls

565 lines (291 loc) · 19.7 KB
Pour contribuer à ce document, merci de lire le README.md

Cpp17 - bibliothèque standard std::

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

La bibliothèque standard du C++17

STL ou std ou bibliothèque standard ?

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

Résumé

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

std::optional

boost::optional --> std::optional

std::any

boost::any --> std::any

std::string_view

std::string_view

std::apply

TODO

xxxxxxxxxxxxxx

  • [func.searchers] and [alg.search]
  • [pmr]
  • std::sample, sampling from a range?

voir les autres extensions

TODO Découper en  plus petites sections

Nouvelles structures de données

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

Library Fundamentals TS v1

[P0220] Library Fundamentals TS v1

TODO

Invoke

[N4169] std::invoke

TODO

[P0077] std::is_callable

TODO

[P0209] std::make_from_tuple et std::apply

TODO

File System TS v1

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 :

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]

Threading

[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

Amélioration des conteneurs

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

Smart pointer

[N4089] Corrections unique_ptr<T[]>

TODO

[N4366] Autres corrections unique_ptr

TODO

[P0033] weak_from_this

TODO

Amélioratons sur d'autres structures de données

[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) ;

Deux cochons en position 69

Fonctions mathématiques

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

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);

Améliorations diverses

[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

Suppression

[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

Fonctionnalités majeures

Quatre gros morceaux ont été inclus dans C++17 :

Par contre, les fonctionnalités suivantes n’ont pas été considérées comme suffisamment mures pour être incluses :

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.

Évolution des fonctionnalités majeures