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


C ++ 17 est maintenant complet, donc peu susceptible de subir de gros changements. Des centaines de propositions ont été avancées pour C ++ 17.

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

Lors de l'utilisation d'un compilateur C ++ prenant en charge "C ++ 1z", lesquelles de ces fonctionnalités seront disponibles lorsque le compilateur sera mis à jour en C ++ 17?


831
2018-06-27 18:06


origine


Réponses:


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, de première classe std::tie avec auto
    • Exemple:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crée des variables it et inserted avec le type déduit de la pair cette map::insert résultats.
    • Fonctionne avec tuple / pair-likes & std::arrays et structures relativement plates
    • En fait nommé liaisons structurées en standard
  • if (init; condition) et switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Étend le if(decl) aux cas où decl n'est pas convertible en bonnet raisonnablement.
  • Généralisation de la plage pour les boucles

    • Semble être principalement le support des sentinelles, ou des itérateurs de fin qui ne sont pas du même type que les itérateurs débutants, ce qui aide avec des boucles terminées par zéro et similaires.
  • si constexpr

    • Beaucoup de fonctionnalités demandées pour simplifier le code presque générique.

Divers

Ajouts à la bibliothèque:

Types de données

  • std::variant<Ts...>

    • Presque toujours non-vide, j'ai vérifié?
    • Tagged type d'union
    • {génial | utile}
  • std::optional

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

    • Contient un de n'importe quoi (qui est copiable)
  • std::string_view

    • std::string comme référence-à-caractère-tableau ou sous-chaîne
    • Ne jamais prendre string const& encore. Peut aussi faire un bajillion fois plus rapide.
    • "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

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 filetage, exposé même si vous ne les utilisez pas

Enfiler

(parties de) Principes fondamentaux de la bibliothèque TS v1 non couvert ci-dessus ou ci-dessous

Améliorations des conteneurs

Changements de pointeurs intelligents

Autre std Améliorations de type de données:

Divers

Traits

Déprécié

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

Naturellement, le travail TS continue en parallèle, il y a donc des TS qui ne sont pas tout à fait mûrs et qui devront attendre la prochaine itération. La cible pour l'itération suivante est C ++ 20 comme prévu précédemment, pas C ++ 19 comme le laissaient entendre certaines rumeurs. C ++ 1O a été évité.

Liste initiale tirée de ce post de reddit et ce post de 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 SD-6 liste de tests de fonctionnalités.

la 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 être fiable, car c'est C ++ 1z, pas C ++ 17.

ces diapositives avait certaines fonctionnalités manquantes ailleurs.

Alors que "ce qui a été supprimé" n'a pas été demandé, voici une courte liste de quelques choses ((la plupart du temps?) Déconseillées) qui sont supprimées dans C ++ 17 de C ++:

Supprimé:

Il y a eu des reformulations. Je ne suis pas sûr si ceux-ci ont un impact sur le code, ou s'ils sont juste des nettoyages dans la norme:

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

  • P0505R0 (constexpr chrono)

  • P0418R2 (tweaks atomiques)

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

  • P0490R0 (tweaks de liaison structurée)

  • P0513R0 (changements à std::hash)

  • P0502R0 (exceptions parallèles)

  • P0509R1 (mise à jour des restrictions sur le traitement des exceptions)

  • P0012R1 (faire des spécifications d'exception faire partie du système de type)

  • P0510R0 (restrictions sur les variantes)

  • P0504R0 (tags pour optionnel / variant / any)

  • P0497R0 (tweaks partagés ptr)

  • P0508R0 (poignées de noeud de liaisons structurées)

  • P0521R0 (nombre d'utilisation du pointeur partagé et modifications uniques?)

Changements de Spec:

Référence supplémentaire:


1051
2018-06-27 18:06