C ++ 17 ist jetzt vollständig, sodass es unwahrscheinlich ist, dass große Änderungen vorgenommen werden. Hunderte von Vorschlägen wurden für C ++ 17 eingereicht.
Welche dieser Funktionen wurden in C ++ 17 zu C ++ hinzugefügt?
Welche dieser Funktionen stehen bei Verwendung eines C ++ - Compilers, der "C ++ 1z" unterstützt, zur Verfügung, wenn der Compiler auf C ++ 17 aktualisiert wird?
Antworten:
Sprachmerkmale:
Vorlagen und generischer Code
Abzug von Vorlagenargumenten für Klassenvorlagen
template <auto>
Korrekturen von Vorlagenargumenten, die nicht vom Typ sind
template<template<class...>typename bob> struct foo {}
(Falten + ... + Ausdrücke) und Überarbeitungen
auto x{8};
ist einint
Modernisierung
using
mit...
und ListenLambda
constexpr Lambdas
Capturing
*this
in lambda[*this]{ std::cout << could << " be " << useful << '\n'; }
Attribute
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
Attribute[[attributes]]
aufnamespace
s undenum { erator[[s]] }
using
in Attributen , um zu vermeiden, dass ein Attribut-Namespace wiederholt werden muss.Compiler müssen jetzt nicht standardmäßige Attribute ignorieren, die sie nicht erkennen .
Syntaxbereinigung
Inline-Variablen
namespace A::B
Einfach
static_assert(expression);
ohne Schnurnein es
throw
sei dennthrow()
undthrow()
istnoexcept(true)
.Sauberere Mehrweg- und Durchflussregelung
Strukturierte Bindungen
std::tie
mitauto
const auto [it, inserted] = map.insert( {"foo", bar} );
it
undinserted
mit abgeleiteten Typ aus den ,pair
dassmap::insert
Renditen.std::array
und relativ flachen Strukturenif (init; condition)
undswitch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
auf Fälle, in denendecl
Convertible-to-Bool nicht sinnvoll ist.Verallgemeinern des Bereichs für Schleifen
wenn constexpr
Sonstiges
Hexadezimale Gleitkomma-Literale
Dynamische Speicherzuordnung für überausgerichtete Daten
Garantierte Kopierentscheidung
Die Reihenfolge der Auswertung für (einige) Ausdrücke mit einigen Änderungen wurde korrigiert
.then
für zukünftige Arbeiten.Direkte Listeninitialisierung von Enums
Forward Progress Guarantee (FPG) (auch FPGs für parallele Algorithmen )
u8'U', u8'T', u8'F', u8'8'
Zeichenliterale (Zeichenfolge bereits vorhanden)"noexcept" im Typsystem
__has_include
Arrays von Zeigerkonvertierungskorrekturen
Beerbte Konstruktoren korrigieren einige Eckfälle ( Beispiele für Verhaltensänderungen finden Sie in P0136R0 ).
Aggregatinitialisierung mit Vererbung .
std::launder
, Typ Punning usw.Bibliothekserweiterungen:
Datentypen
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
wie Referenz-auf-Zeichen-Array oder Teilzeichenfolgestring const&
. Kann auch das Parsen einer Bajillion Mal beschleunigen."hello world"sv
char_traits
std::byte
mehr weg, als sie kauen konnten.Sachen aufrufen
std::invoke
std::apply
std::make_from_tuple
,std::apply
angewendet auf die Objektkonstruktionis_invocable
,is_invocable_r
,invoke_result
result_of
is_invocable<Foo(Args...), R>
wird „können Sie rufenFoo
mitArgs...
und etwas kompatibelR
“, woR=void
ist die Standardeinstellung.invoke_result<Foo, Args...>
iststd::result_of_t<Foo(Args...)>
aber anscheinend weniger verwirrend?Dateisystem TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
und[class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
s kann sowohl mitpath
s als auch mitconst path::value_type*
Strings geöffnet werden .Neue Algorithmen
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
Für Threading-Zwecke hinzugefügt, auch verfügbar, wenn Sie sie nicht mit Threading verwenden
Einfädeln
std::shared_mutex
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
std::lock
Schmerzen, wenn mehr als ein Mutex gleichzeitig gesperrt wird.Parallelität TS v1
std
Algorithmen und verwandten MaschinenHardware _ * _ Interferenzgröße
(Teile von) Library Fundamentals TS v1 , die oben oder unten nicht behandelt werden
[func.searchers]
und[alg.search]
[pmr]
std::function
bei Allokatorenstd::sample
, Probenahme aus einem Bereich?Containerverbesserungen
try_emplace
undinsert_or_assign
Splicing für
map<>
,unordered_map<>
,set<>
, undunordered_set<>
Nicht-Konstante
.data()
für Zeichenfolge.Nichtmitglied
std::size
,std::empty
,std::data
std::begin
/end
Minimale unvollständige Typunterstützung in Containern
Aneinandergrenzender Iterator "Konzept"
constexpr
IteratorenDie
emplace
Funktionsfamilie gibt jetzt einen Verweis auf das erstellte Objekt zurück .Smart Pointer ändert sich
unique_ptr<T[]>
Korrekturen und andereunique_ptr
Verbesserungen.weak_from_this
und einige behoben, um daraus zu teilenWeitere
std
Verbesserungen des Datentyps:{}
Baustd::tuple
und andere VerbesserungenSonstiges
Die C ++ 17-Bibliothek basiert auf C11 anstelle von C99
Reserviert
std[0-9]+
für zukünftige Standardbibliothekendestroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
std
Implementierungen verfügbar gemachtstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
grobgcd
undlcm
std::uncaught_exceptions
std::as_const
std::bool_constant
_v
Vorlagenvariablenstd::void_t<T>
std::owner_less<void>
std::less<void>
, aber für intelligente Zeiger nach Inhalt zu sortierenstd::chrono
Polierenstd::conjunction
,std::disjunction
,std::negation
Ausgesetztstd::not_fn
std
std :: default_order , Indirektion vorbei( Bricht ABI einiger Compiler aufgrund von Namensverfälschung ab, entfernt.)std::less
.Züge
Veraltet
<codecvt>
memory_order_consume
result_of
, Ersetzt mitinvoke_result
shared_ptr::unique
ist es nicht sehr threadsicherIsocpp.org hat eine unabhängige Liste von Änderungen seit C ++ 14; es wurde teilweise geplündert.
Natürlich wird die TS-Arbeit parallel fortgesetzt, daher gibt es einige nicht ganz reife TS, die auf die nächste Iteration warten müssen. Das Ziel für die nächste Iteration ist C ++ 20 wie zuvor geplant, nicht C ++ 19, wie einige Gerüchte andeuten. C ++ 1O wurde vermieden.
Erste Liste aus diesem reddit-Beitrag und diesem reddit-Beitrag mit Links, die über googeln oder von der obigen Seite isocpp.org hinzugefügt wurden.
Zusätzliche Einträge aus der SD-6- Funktionstestliste.
Klirren der Feature - Liste und Bibliothek Feature - Liste sind neben ausgeplündert werden. Dies scheint nicht zuverlässig zu sein, da es sich um C ++ 1z und nicht um C ++ 17 handelt.
Diese Folien hatten einige Funktionen, die an anderer Stelle fehlten.
Während "Was wurde entfernt" nicht gefragt wurde, finden Sie hier eine kurze Liste einiger Dinge ((meistens?), Die zuvor veraltet waren), die in C ++ 17 aus C ++ entfernt wurden:
Entfernt:
register
, Schlüsselwort für zukünftige Verwendung reserviertbool b; ++b;
<functional>
Zeug,random_shuffle
std::function
Es gab Umformulierungen. Ich bin mir nicht sicher, ob diese Auswirkungen auf den Code haben oder ob es sich nur um Bereinigungen im Standard handelt:
Papiere, die oben noch nicht integriert sind:
P0505R0 (constexpr chrono)
P0418R2 (atomare Optimierungen)
P0512R0 ( Optimierungen beim Abzug von Vorlagenargumenten)
P0490R0 (strukturierte Bindungsänderungen)
P0513R0 (Änderungen an
std::hash
)P0502R0 (parallele Ausnahmen)
P0509R1 (Aktualisierung der Einschränkungen für die Ausnahmebehandlung)
P0012R1 (Ausnahmespezifikationen als Teil des Typsystems festlegen )
P0510R0 (Variantenbeschränkungen)
P0504R0 (Tags für optional / Variante / beliebig)
P0497R0 (gemeinsame ptr-Optimierungen)
P0508R0 ( Knotenhandles für strukturierte Bindungen)
P0521R0 ( Anzahl der gemeinsam genutzten Zeiger und eindeutige Änderungen?)
Spezifikationsänderungen:
Weitere Referenz:
Papiere nach Jahr gruppiert; nicht alle akzeptiert
https://isocpp.org/files/papers/p0636r0.html
quelle
memory_order_consume
scheint nicht offiziell veraltet zu sein. In der Notiz wird nur davon abgeraten. Vielleicht ist es sinnvoll, dies zu erwähnen (zum Beispiel mit einer nachgestellten Klammer)?