In den letzten Wochen traf sich das C++-Komitee in Oulu, wo die endgültigen Funktionen von C++17 festgelegt wurden und C++17 im Begriff ist, ein internationaler Standard zu werden. Nach dem letzten Treffen in Jacksonville hatte ich keine großen Hoffnungen, dass C++17 große Überraschungen bringen würde, aber das Treffen in Oulu hat hart daran gearbeitet, dem neuen C++17-Standard einige wichtige und interessante Funktionen hinzuzufügen. Die Reddit-Seite bietet einen guten Überblick über die C++17-Funktionen, und Herb Sutter gab auch in einer aktuellen CppCast-Site (und seinem Reisebericht) einen guten Einblick in die C++17-Funktionen. Darüber hinaus gibt uns Michael Wong einen umfassenderen Überblick über die Funktionen von C++17.
Lassen Sie mich zuerst über die wichtigen Dinge sprechen
Wie ich bereits sagte, das Treffen in Jacksonville Nach dem Treffen Viele Funktionen von C++17 waren sehr klar. Ich habe eine dreiteilige Blogserie geschrieben, in der ich einige Ratschläge für den Umstieg auf C++17 gebe. Wir werden in ein neues Jahrhundert von C++ eintreten und relevante Standards werden zusammen mit leistungsstarken technischen Spezifikationen veröffentlicht, die Teil der nächsten Generation von C++-Standards werden. Das bedeutet, dass Nicht-C++17-Funktionen (wie Konzepte oder Module) in kommenden Compiler-Releases als Plugins verfügbar sein werden. Visual Studio stellt derzeit Module bereit, aber GCC ist der erste Compiler, der das Konzept unterstützt. Clang unterstützt auch Module, und sowohl Visual Studio als auch Clang werden in Kürze Modul-TS-basierte Spezifikationen implementieren. <🎜> Der C++-Standard wird keine neuen Inhalte hinzufügen, aber einige mehr oder weniger große Änderungen mit sich bringen. Aber ich hoffe immer noch, dass all diese Features den finalen Test bestehen.
Das letzte Highlight von C++17
std::variant
Beginnen wir mit dem, was mich am meisten überrascht hat: den Variationen. Ja, im Ernst, C++17 bringt std::variant. Das ist großartig und ebnet den Weg für zukünftige Funktionen, die auf Varianten und anderen damit verbundenen Ideen basieren. Zum Beispiel Stilanpassung, darüber gibt es in C++ einen wirklich guten Vortrag. Laut David Sankel ist std::variant nach boost::variant und/oder anderen Variantenbibliotheken konzipiert. Sehr ähnliche API wie boost::variant
if constexpr(expression)
variant<int, float> v, w; v = 12;int i = get<int>(v); w = get<int>(v); w = get<0>(v); // same effect as the previous linew = v; // same effect as the previous lineget<double>(v); // ill formedget<3>(v); // ill formedtry { get<float>(w); // will throw.}catch (bad_variant_access&) {}
if constexpr (std::is_integer ...) { //integerstuff } else if constexpr (std::is_floating_point ...) { //floatingpointstuff } else { // NaN ;) }
Eine weitere interessante Sache: Diese Funktion wird als if constexpr geschrieben, aber die Standardschreibweise nennt sie immer noch constexpr if, definiert sie aber als if constexpr.
Auto in Vorlagen verwenden
Für C++14 können anonyme Ausdrücke auto verwenden, um generische Typparameter zu definieren . Derzeit kann auto auch zum Definieren von (nicht typspezifischen) Vorlagenparametern verwendet werden. Dies erleichtert das Schreiben von Vorlagencode, da auto kürzer als class oder typename ist. Sie können auto auch verwenden, um Vorlagenparameter variabler Länge zu definieren, zum Beispiel: template
Strukturierte Bindung
Bisher wird immer noch ein berühmter Trick verwendet, nämlich die freie Verwendung von std: :tie, um ein Tupel oder Paar unterschiedlicher Variablen direkt zuzuweisen, ohne sich manuell mit dem Ergebnistyp befassen zu müssen. Dies ist ein Trick, und die Variable muss vorhanden sein. Jetzt können Sie die Variable deklarieren und in einer Zeile initialisieren:
Die Klammern dürfen nicht fehlen und getvalues gibt ein Tupel zurück. Da std::pair in der Empfehlung nicht erwähnt wird, ist nicht klar, ob die Verwendung von „pair“ auch ordnungsgemäß funktioniert. Es wird von STL in einigen Einfügemethoden zurückgegeben.
auto [a , b , c] = getvalues();
if and switch with initialization
Jetzt können Variablen in der if-Anweisung definiert werden: if(int x = 42; true != false), die mit den vorherigen Vorschlägen kombiniert werden können. In einer if-Anweisung definierte Variablen sind auch in ihrem else-Teil gültig. Ich erinnere mich, dass modernes C++-Design einen Trick wie geschweifte Klammern vorschlug, um dies zu erreichen, aber das galt nur für eine einzelne Variable.
Es ist interessant, diesen Fall zu verwenden, z. B. das Sperren von if oder switch. Alle von diesen Funktionen zurückgegebenen Statuscodes können jetzt innerhalb von if verarbeitet werden. Im Wesentlichen entspricht dies dem Schreiben von { var x = value;
Mehr
Das ist noch nicht alles, zum Beispiel ist für die Verbesserung der Copy-Ellision (Kopierentfernung) der Namespace std[0-9]+ für zukünftige Standards reserviert. Außerdem gibt es viele interessante Diskussionen und Meinungen zu reddit.
Der C++ 17-Standard entwickelt und verbessert sich schrittweise, und auch standardisierte Tools sind ausgereift und in Betrieb genommen worden. Dies ist der größte Gewinn für C++. Wer zum nächsten C++-Standard beitragen möchte, sollte vielleicht schon jetzt mit der Planung beginnen. Die Standardisierung von C++ wurde schon immer von Freiwilligen vorangetrieben. Es gibt kein Geld dafür, und jeder ist im Grunde jemand, dessen tägliche Arbeit mit C++ zu tun hat. Ich empfehle Ihnen, einen Blick auf isocpp.org zu werfen, dort gibt es eine sehr schöne und ausführliche Einführung. Außerdem gibt es verschiedene Mailinglisten und Arbeitsgruppen, denen Sie beitreten können.
Das Obige ist der Inhalt der endgültigen Funktionen von C++17. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).