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?

Yakk - Adam Nevraumont
la source
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:

Yakk - Adam Nevraumont
la source
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