Quelles sont les nouvelles fonctionnalités de C ++ 17?


1007

C ++ 17 est désormais complet, il est donc peu probable qu'il subisse de grands changements. Des centaines de propositions ont été avancées pour C ++ 17.

Lesquelles de ces fonctionnalités ont été ajoutées à C ++ dans C ++ 17?

Lorsque vous utilisez un compilateur C ++ qui prend en charge "C ++ 1z", lesquelles de ces fonctionnalités seront disponibles lorsque le compilateur mettra à jour vers C ++ 17?


26
Liste complète des fonctionnalités selon Clang: bibliothèque , langage principal .
Kerrek SB

3
ce bost blog a un bon résumé: bfilipek.com/2017/01/cpp17features.html
atb

13
Voir le document officiel Changements entre C ++ 14 et C ++ 17 DIS (P0636r0) pour une liste des changements majeurs de C ++ 14 à C ++ 17.
jotik

1
@RaghavNavada Super! La section C ++ 20 est-elle maintenue? Il y a le # 53 , mais il est fermé ...
LF

Tout dans ce site en.cppreference.com/w/cpp est marqué avec la version requise.
jw_

Réponses:


1266

Caractéristiques linguistiques:

Modèles et code générique

Lambda

Les attributs

Nettoyage de la syntaxe

Contrôle de retour et de débit plus propre

  • Fixations structurées

    • Fondamentalement, de première classe std::tieavecauto
    • Exemple:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crée des variables itet insertedavec le type déduit de la pairque des map::insertretours.
    • Fonctionne avec les tuple / pair-likes & std::arrays et les structures relativement plates
    • Liaisons structurées réellement nommées en standard
  • if (init; condition) et switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Prolonge les if(decl)cas où decln'est pas convertible en bool sensiblement.
  • Généralisation basée sur la plage pour les boucles

    • Semble principalement prendre en charge les sentinelles ou les itérateurs de fin qui ne sont pas du même type que les itérateurs de début, ce qui facilite les boucles à terminaison nulle et autres.
  • si constexpr

    • Fonctionnalité très demandée pour simplifier le code presque générique.

Divers

Ajouts à la bibliothèque:

Types de données

  • std::variant<Ts...>

    • Presque toujours non vide la dernière fois que j'ai vérifié?
    • Tagged type d'union
    • {génial | utile}
  • std::optional

    • Peut-être détient-il quelque chose
    • Ridiculement utile
  • std::any

    • Peut contenir n'importe quoi (qui est copiable)
  • std::string_view

    • std::string comme la référence à un tableau de caractères ou une sous-chaîne
    • Ne prenez plus jamais string const&. Peut également accélérer l'analyse d'un bajillion de fois.
    • "hello world"sv
    • constexpr char_traits
  • std::byte plus qu'ils ne pouvaient mâcher.

    • Ni un entier ni un caractère, juste des données

Appeler des trucs

Système de fichiers TS v1

De nouveaux algorithmes

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Ajouté à des fins de threading, exposé même si vous ne les utilisez pas

Enfiler

(parties de) Library Fundamentals TS v1 non couvert ci-dessus ou ci-dessous

Améliorations des conteneurs

Modifications du pointeur intelligent

Autres stdaméliorations de type de données:

Divers

Traits

Obsolète

Isocpp.org a une liste indépendante de changements depuis C ++ 14; il a été partiellement pillé.

Naturellement, le travail TS se poursuit en parallèle, il y a donc certains TS qui ne sont pas tout à fait mûrs qui devront attendre la prochaine itération. La cible pour la prochaine itération est le C ++ 20 comme prévu précédemment, et non le C ++ 19 comme le suggèrent certaines rumeurs. C ++ 1O a été évité.

Liste initiale tirée de ce post reddit et de ce post reddit , avec des liens ajoutés via googling ou à partir de la page isocpp.org ci-dessus.

Entrées supplémentaires pillées à partir de la liste de test de fonctionnalité SD-6 .

La liste des fonctionnalités de clang et liste des fonctionnalités bibliothèque sont à côté d'être pillée. Cela ne semble pas fiable, car il s'agit de C ++ 1z, pas de C ++ 17.

ces diapositives avaient des fonctionnalités manquantes ailleurs.

Bien que "ce qui a été supprimé" n'ait pas été demandé, voici une courte liste de quelques éléments ((principalement?) Obsolètes précédents) qui sont supprimés en C ++ 17 de C ++:

Supprimé:

Il y a eu des reformulations. Je ne sais pas si ceux-ci ont un impact sur le code, ou si ce ne sont que des nettoyages dans la norme:

Articles non encore intégrés dans ci-dessus:

  • P0505R0 (constexpr chrono)

  • P0418R2 (réglages atomiques)

  • P0512R0 (réglages de déduction d'argument de modèle)

  • P0490R0 (réglages de liaison structurés)

  • P0513R0 (modifie std::hash)

  • P0502R0 (exceptions parallèles)

  • P0509R1 (mise à jour des restrictions sur la gestion des exceptions)

  • P0012R1 (intégrer les spécifications d'exception au système de types)

  • P0510R0 (restrictions sur les variantes)

  • P0504R0 (balises pour facultatif / variante / tout)

  • P0497R0 (réglages ptr partagés)

  • P0508R0 (poignées de nœud de liaisons structurées)

  • P0521R0 (nombre d'utilisation de pointeurs partagés et modifications uniques?)

Modifications des spécifications:

Référence supplémentaire:


2
Hum, memory_order_consumene semble pas officiellement obsolète. C'est juste découragé dans la note. Peut-être qu'il est logique de le mentionner (avec une parenthèse finale, par exemple)?
LF
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.