web-dev-qa-db-fra.com

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

C++ 17 est maintenant complet, il est donc peu probable que de gros changements se produisent. Des centaines de propositions ont été avancées pour C++ 17.

Lesquelles de ces fonctionnalités ont été ajoutées au C++ en C++ 17?

Lors de l'utilisation d'un compilateur C++ prenant en charge "C++ 1z", quelles fonctionnalités seront disponibles lors de la mise à jour du compilateur vers C++ 17?

965

Caractéristiques linguistiques:

Modèles et code générique

Lambda

Les attributs

Nettoyage de la syntaxe

Nettoyeur multi-retour et contrôle de flux

  • Liaisons structurées

    • Fondamentalement, std::tie de première classe avec auto
    • Exemple:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crée les variables it et inserted avec un type déduit de pair renvoyé par map::insert.
    • Fonctionne avec les Tuple/paires-like & std::arrays et les structures relativement plates
    • En réalité nommé liaisons structurées en standard
  • if (init; condition) ET switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Étend la if(decl) aux cas où decl n'est pas convertible de manière sensée.
  • Généralisation basée sur une plage pour les boucles

    • Il semble que ce soit principalement un support pour les sentinelles, ou des itérateurs de fin qui ne sont pas du même type que les débutants, ce qui aide les boucles à terminaison NULL et autres.
  • si constexpr

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

Misc

Ajouts à la bibliothèque:

Types de données

  • std::variant<Ts...>

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

    • Peut-être détient l'un de quelque chose
    • Ridiculement utile
  • std::any

    • Peut contenir tout ce qui est copiable
  • std::string_view

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

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

Invoquer des trucs

Système de fichiers TS v1

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 threadé

Filetage

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

Amélioration des conteneurs

Changements de pointeur intelligent

Autres améliorations du type de données std:

Misc

Traits

Obsolète

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

Naturellement, le travail de TS se poursuit en parallèle, de sorte que certains TS qui ne sont pas encore assez mûrs devront attendre la prochaine itération. La cible pour la prochaine itération est C++ 20 comme prévu précédemment, pas C++ 19 comme le supposent certaines rumeurs. C++ 1O a été évité.

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

Entrées supplémentaires extraites de SD-6 liste de tests de fonctionnalités.

liste des fonctionnalités de clang et liste des fonctionnalités de la bibliothèque sont les prochains à être pillés. Cela ne semble pas fiable, car il s’agit de C++ 1z et non de C++ 17.

ces diapositives il manquait certaines fonctionnalités ailleurs.

Bien que "ce qui a été supprimé" n'ait pas été demandé, voici une courte liste de quelques éléments ((la plupart du temps obsolètes) obsolètes) supprimés de C++ dans C++ 17:

Enlevé:

Il y avait des reformulations. Je ne sais pas si cela a un impact sur le code, ou si ce sont juste des nettoyages dans la norme:

Papiers non encore intégrés ci-dessus:

  • P0505R (constexpr chrono)

  • P0418R2 (réglages atomiques)

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

  • P0490R (réglages structurés de la liaison)

  • P0513R (remplace par std::hash)

  • P0502R (exceptions parallèles)

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

  • P0012R1 (les spécifications d'exception doivent faire partie du système de types)

  • P0510R (restrictions sur les variantes)

  • P0504R (tags pour optionnel/variant/quelconque)

  • P0497R (réglages de ptr partagés)

  • P0508R (descripteurs de noeud de liaisons structurées)

  • P0521R (nombre d'utilisations de pointeur partagé et modifications uniques?)

Modifications techniques:

Référence supplémentaire:

1230