C++17
Apparence
C++17 | |
Date de première version | |
---|---|
Site web | www.iso.org/standard/68564.html |
modifier |
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 sous le nom de ISO/CEI 14882:2017.
Le dernier working draft gratuit est le N4659, qui date du , les seules différences avec le standard étant des corrections éditoriales.
Suppression
[modifier | modifier le code]Cette version de C++ a non seulement ajouté de nouvelles fonctionnalités, mais en a également supprimé quelques-unes.
- Suppression des trigrammes[1],[2].
- 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[3],[4]. Celles-ci ont été remplacées dans C++11 par des fonctionnalités améliorées telles questd::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[5]. Ce mot-clé reste réservé.
Nouvelles fonctionnalités
[modifier | modifier le code]Langage
[modifier | modifier le code]- Le message de
static_assert
est facultatif[6]. - Utilisation possible de
typename
(comme alternative àclass
) pour les paramètres detemplate template
[7]. - Nouvelles règles de déduction des braced-init-list avec
auto
[8],[3]. - Définitions d'espace de noms imbriquées :
namespace X::Y { … }
au lieu denamespace X { namespace Y { … } }
[3],[9]. - Utilisation d'attributs sur les espaces de noms et les énumérateurs[10].
- Nouveaux attributs standards
[[fallthrough]]
[11],[[maybe_unused]]
[12] et[[nodiscard]]
[13]. - Caractères littéraux UTF-8 (
u8
)[14] (les chaines littérales UTF-8 existent depuis C++11). - Littéraux hexadécimaux à virgule flottante[15].
- Utilisation de
auto
pour les non-type template parameter[16]. - Évaluation constante des arguments des non-type template parameter[17].
- fold expression pour les variadic template[18].
if
statique évalué à la compilation :if constexpr(expression)
[19].- Déclarations structured binding :
auto [a, b] = getTwoReturnValues();
[20]. - Initialiseurs dans les instructions
if
etswitch
[21]. - L'initialisation par copie et l'initialisation directe d'objets de type
T
partir deprvalue
de typeT
(en ignorant les qualificatifs cv) n'entraîne l'appel d'aucun constructeur de copie ni de déplacement à partir de l'expressionprvalue
(élision de copie). - Déduction des arguments des classes templates disponibles pour les constructeurs[22],[23]. Autorisant l'écriture
std::pair(5.0, false)
au lieu d'exiger la fourniture explicite des types des arguments du constructeurstd::pair<double, bool>(5.0, false)
ou une fonction de construction intermédiairestd::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 fonctionsinline
). __has_include
permettant de vérifier la disponibilité d'un en-tête par les directives du préprocesseur[24].- La valeur de
__cplusplus
est changée en201703L
[25]. - Les spécifications d'exception ont été intégrées à la signature des fonctions[26].
- Les expressions lambda peuvent capturer
*this
par valeur[27].
Bibliothèque
[modifier | modifier le code]- La majorité de Library Fundamentals V1 TS, y compris [28] :
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[29].std::optional
: représentation d'objets facultatifs.std::any
pour contenir des valeurs uniques de tout type.
std::uncaught_exceptions
en remplacement destd::uncaught_exception<
dans la gestion des exceptions[30].- Nouvelles fonctions d'insertion
try_emplace
etinsert_or_assign
pour les structures de données associativesstd::map
etstd::unordered_map
[31]. - Fonctions libres d'accès uniforme au conteneur
std::size
,std::empty
etstd::data
[32]. - Définition des « itérateurs contigus »[33].
- Bibliothèque de système de fichiers basée sur
boost::filesystem
[34]. - Versions parallèles de plusieurs algorithmes STL[35].
- Fonctions spéciales mathématiques supplémentaires, y compris les intégrales elliptiques et les fonctions de Bessel[36].
std::variant
: un type somme[37].std::byte
: type représentant un multiplet de données comme un multiplet plutôt qu'un caractère[38].- Traits modélisant les opérateurs logiques :
std::conjunction
,std::disjunction
etstd::negation
[39].
Références
[modifier | modifier le code]- (en) Richard Smith, « N3981 - Removing trigraphs??! »,
- (en) Michael Wong, Hubert Tong, Rajan Bhakta et Derek Inglis, « N4210 - IBM comment on preparing for a Trigraph-adverse future in C++17 » [PDF],
- (en) Herb Sutter, « Updates to my trip report »,
- (en) Stephan T. Lavavej, « N4190 - Removing auto_ptr, random_shuffle(), And Old <functional> Stuff »,
- (en) Alisdair Meredith, « P0001R1 - Remove Deprecated Use of the register Keyword »,
- (en) Walter E. Brown, « N3928 - Extending static_assert, v2 » [PDF],
- (en) Richard Smith, « N4051 - Allow typename in a template template parameter »,
- (en) James Dennett, « N3922 - New Rules for auto deduction from braced-init-list »,
- (en) Robert Kawulak et Andrew Tomazos, « N4230 - Nested namespace definition »,
- (en) Richard Smith, « N4266 - Attributes for namespaces and enumerators »,
- (en) Andrew Tomazos, « P0188R1 - Wording for [[fallthrough]] attribute » [PDF],
- (en) Andrew Tomazos, « P0212R1 - Wording for [[maybe_unused]] attribute » [PDF],
- (en) Andrew Tomazos, « P0189R0 - Wording for [[nodiscard]] attribute » [PDF],
- (en) Richard Smith, « N4267 - Adding u8 character literals »,
- (en) Thomas Köppe, « P00245R1 - Hexadecimal floating literals for C++ »,
- (en) James Touton et Mike Spertus, « P0127R2 - Declaring non-type template parameters with auto »,
- (en) Richard Smith, « N4268 - Allow constant evaluation for all non-type template arguments »,
- (en) Andrew Sutton et Richard Smith, « N4295 - Folding expressions »,
- (en) Jens Maurer, « P0292R2 - constexpr if: A slightly different syntax »,
- (en) Jens Maurer, « P0217R3 - Proposed wording for structured bindings »,
- (en) Thomas Köppe, « P0305R1 - Selection statements with initializer »,
- (en) Mike Spertus, Faisal Vali et Richard Smith, « P0091R3 - Template argument deduction for class templates »,
- (en) « CppCon 2018: Timur Doumler “Class template argument deduction in C++17” »
- (en) Clark Nelson et Richard Smith, « P0061R1 - __has_include for C++17 »,
- (en) « N4659 - Working Draft, Standard for Programming Language C++ » [PDF]
- (en) Jens Maurer, « P0012R1 - Make exception specifications be part of the type system, version 5 »,
- (en) H. Carter Edwards, Daveed Vandevoorde, Christian Trott et al., « P0018R3 - Lambda Capture of *this by Value as [=,*this] »,
- (en) Beman Dawes et Alisdair Meredith, « P0220R1 - Adopt Library Fundamentals V1 TS Components for C++17 (R1) »,
- (en) Jeffrey Yasskin, « N3921 - string_view: a non-owning reference to a string »,
- (en) Herb Sutter, « N4259 - Wording for std::uncaught_exceptions » [PDF],
- (en) Thomas Köppe, « N4279 - Improved insertion interface for unique-key maps »,
- (en) Riccardo Marcangelo, « N4280 - Non-member size() and more » [PDF],
- (en) Jens Maurer, « N4284 - Contiguous Iterators »,
- (en) Beman Dawes, « N3505 - Filesystem Library Proposal »,
- (en) Jared Hoberock, « P0024R2 - The Parallelism TS Should be Standardized »,
- (en) Walter E. Brown, Axel Naumann et Edward Smith-Rowland, « P0226R1 - Mathematical Special Functions for C++17 » [PDF],
- (en) Axel Naumann, « P0088R3 - Variant: a type-safe union for C++17 »,
- (en) Neil MacIntosh, « P0298R3 - A byte type definition » [PDF],
- (en) Jonathan Wakely, « P0013R1 - Logical Operator Type Traits »,