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?
déduction d'argument de modèle pour les modèles de classe
[*this]{ std::cout << could << " be " << useful << '\n'; }
[[fallthrough]]
, [[nodiscard]]
, [[maybe_unused]]
attributs
using
dans attributs pour éviter de devoir répéter un espace de nom d'attribut.
Les compilateurs sont maintenant requis pour ignorer les attributs non standard qu'ils ne reconnaissent pas .
Simple static_assert(expression);
sans chaîne
no throw
sauf si throw()
, et throw()
est noexcept(true)
.
std::tie
de première classe avec auto
const auto [it, inserted] = map.insert( {"foo", bar} );
it
et inserted
avec un type déduit de pair
renvoyé par map::insert
.std::array
s et les structures relativement platesif (init; condition)
ET switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
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
Allocation de mémoire dynamique pour les données suralignées
Ordre d'évaluation fixe pour (certaines) expressions avec quelques modifications
.then
sur les travaux futurs.Garanties de progression vers l'avant (FPG) (aussi, FPG pour algorithmes parallèles )
u8'U', u8'T', u8'F', u8'8'
littéraux de caractères (la chaîne existait déjà)
constructeurs hérités corrige certains cas (voir P0136R pour obtenir des exemples de changements de comportement)
std::string
comme une référence ou un sous-chaîne de caractèresstring const&
. Peut également rendre l'analyse d'un bajillion de fois plus rapide."hello world"sv
char_traits
std::byte
plus que ce qu'ils pourraient mâcher.
std::invoke
std::apply
std::make_from_Tuple
, std::apply
appliqué à la construction d'objet
is_invocable
, is_invocable_r
, invoke_result
result_of
is_invocable<Foo(Args...), R>
est "pouvez-vous appeler Foo
avec Args...
et obtenir quelque chose de compatible avec R
", où R=void
est la valeur par défaut.invoke_result<Foo, Args...>
est std::result_of_t<Foo(Args...)>
mais apparemment moins déroutant?[class.directory_iterator]
et [class.recursive_directory_iterator]
fstream
s peut être ouvert avec path
s, ainsi qu'avec les chaînes const path::value_type*
.
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é
atomic<T>
::is_always_lockfree
std::lock
lors du verrouillage de plusieurs mutex à la fois.std
et machines connexes[func.searchers]
et [alg.search]
std::function
pour les allocateursstd::sample
, échantillonnage d'une plage?
try_emplace
et insert_or_assign
Épissage pour map<>
, unordered_map<>
, set<>
et unordered_set<>
non-const .data()
pour chaîne.
non-membre std::size
, std::empty
, std::data
std::begin
/end
La famille de fonctions emplace
renvoie maintenant une référence à l'objet créé .
unique_ptr<T[]>
corrige et autres unique_ptr
ajustements.weak_from_this
et quelques uns sont partagés depuisstd
:{}
construction de std::Tuple
et autres améliorationsLa bibliothèque C++ 17 est basée sur C11 au lieu de C99
Réservé std[0-9]+
pour futures bibliothèques standard
std
exposéesstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
à peu prèsgcd
ET lcm
std::uncaught_exceptions
std::as_const
std::bool_constant
_v
std::void_t<T>
std::owner_less<void>
std::less<void>
, mais pour que les pointeurs intelligents trient en fonction du contenustd::chrono
polonaisstd::conjunction
, std::disjunction
, std::negation
exposéstd::not_fn
std
std::less
.<codecvt>
memory_order_consume
result_of
, remplacé par invoke_result
shared_ptr::unique
, ce n'est pas très threadsafeIsocpp.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:
register
, mot-clé réservé pour une utilisation futurebool b; ++b;
<functional>
, random_shuffle
std::function
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:
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?)
https://isocpp.org/files/papers/p0636r0.html