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?
Réponses:
Caractéristiques linguistiques:
Modèles et code générique
Déduction d'argument de modèle pour les modèles de classe
template <auto>
Correctifs des arguments de modèle non-type
template<template<class...>typename bob> struct foo {}
(Pliage + ... + expressions) et Révisions
auto x{8};
est unint
modernisation
using
avec...
et listesLambda
constexpr lambdas
Capturer
*this
en lambdas[*this]{ std::cout << could << " be " << useful << '\n'; }
Les attributs
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
Attributs[[attributes]]
surnamespace
s etenum { erator[[s]] }
using
dans les attributs pour éviter d'avoir à répéter un espace de noms d'attribut.Les compilateurs doivent désormais ignorer les attributs non standard qu'ils ne reconnaissent pas .
Nettoyage de la syntaxe
Variables en ligne
namespace A::B
Simple
static_assert(expression);
sans chaînenon à
throw
moinsthrow()
, etthrow()
estnoexcept(true)
.Contrôle de retour et de débit plus propre
Fixations structurées
std::tie
avecauto
const auto [it, inserted] = map.insert( {"foo", bar} );
it
etinserted
avec le type déduit de lapair
que desmap::insert
retours.std::array
s et les structures relativement platesif (init; condition)
etswitch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
cas oùdecl
n'est pas convertible en bool sensiblement.Généralisation basée sur la plage pour les boucles
si constexpr
Divers
Littéraux hexadécimaux à virgule flottante
Allocation dynamique de mémoire pour les données suralignées
Élision de copie garantie
Ordre d'évaluation fixe pour (certaines) expressions avec quelques modifications
.then
des travaux futurs.Initialisation directe de la liste des énumérations
Garanties de progression (FPG) (également, FPG pour algorithmes parallèles )
u8'U', u8'T', u8'F', u8'8'
littéraux de caractères (la chaîne existait déjà)"noexcept" dans le système de type
__has_include
Tableaux de corrections de conversion de pointeur
Les constructeurs hérités corrigent certains cas d'angle (voir P0136R0 pour des exemples de changements de comportement)
initialisation agrégée avec héritage .
std::launder
, type punning, etc.Ajouts à la bibliothèque:
Types de données
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
comme la référence à un tableau de caractères ou une sous-chaînestring const&
. Peut également accélérer l'analyse d'un bajillion de fois."hello world"sv
char_traits
std::byte
plus qu'ils ne pouvaient mâcher.Appeler des trucs
std::invoke
std::apply
std::make_from_tuple
,std::apply
appliqué à la construction d'objetsis_invocable
,is_invocable_r
,invoke_result
result_of
is_invocable<Foo(Args...), R>
est "pouvez-vous appelerFoo
avecArgs...
et obtenir quelque chose de compatible avecR
", oùR=void
est par défaut.invoke_result<Foo, Args...>
eststd::result_of_t<Foo(Args...)>
apparemment moins déroutant?Système de fichiers TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
et[class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
s peut être ouvert avecpath
s, ainsi qu'avec desconst path::value_type*
chaînes.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
std::shared_mutex
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
std::lock
douleur lors du verrouillage de plus d'un mutex à la fois.Parallélisme TS v1
std
algorithmes et de machines associéesmatériel _ * _ taille_interférence
(parties de) Library Fundamentals TS v1 non couvert ci-dessus ou ci-dessous
[func.searchers]
et[alg.search]
[pmr]
std::function
pour les allocateursstd::sample
, échantillonnage à partir d'une plage?Améliorations des conteneurs
try_emplace
etinsert_or_assign
Splicing pour
map<>
,unordered_map<>
,set<>
etunordered_set<>
non const
.data()
pour chaîne.non-membre
std::size
,std::empty
,std::data
std::begin
/end
Prise en charge minimale des types incomplets dans les conteneurs
"Concept" d'itérateur contigu
constexpr
itérateursLa
emplace
famille de fonctions renvoie désormais une référence à l'objet créé .Modifications du pointeur intelligent
unique_ptr<T[]>
corrections et autresunique_ptr
ajustements.weak_from_this
et certains fixes à partagé à partir de cetteAutres
std
améliorations de type de données:{}
constructionstd::tuple
et autres améliorationsDivers
La bibliothèque C ++ 17 est basée sur C11 au lieu de C99
Réservé
std[0-9]+
aux futures bibliothèques standarddestroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
std
exposé dans la plupart des implémentationsstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
grossièrementgcd
etlcm
std::uncaught_exceptions
std::as_const
std::bool_constant
_v
variables de modèlestd::void_t<T>
std::owner_less<void>
std::less<void>
, mais pour les pointeurs intelligents pour trier en fonction du contenustd::chrono
polonaisstd::conjunction
,std::disjunction
,std::negation
Exposéstd::not_fn
std
std :: default_order , indirection terminée( interrompt l'ABI de certains compilateurs en raison d'un changement de nom, supprimé.)std::less
.Traits
Obsolète
<codecvt>
memory_order_consume
result_of
, remplacé parinvoke_result
shared_ptr::unique
, ce n'est pas très sûrIsocpp.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é:
register
, mot-clé réservé pour une utilisation futurebool b; ++b;
<functional>
trucs,random_shuffle
std::function
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:
articles regroupés par année; pas tous acceptés
https://isocpp.org/files/papers/p0636r0.html
la source
memory_order_consume
ne 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)?