Heim  >  Artikel  >  Backend-Entwicklung  >  Endgültige Funktionen für C++17

Endgültige Funktionen für C++17

黄舟
黄舟Original
2017-02-06 14:15:021365Durchsuche

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. 3bb3ba5d8a8c1e677360c9d603cb067b 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


Ich freue mich sehr, dass diese Funktion im C++17-Standard enthalten ist, anstatt TS-Umweg zu übernehmen.


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&) {}
Dies ist die C++-Version von static if (fast). Für mich war dies einer der Höhepunkte von Jacksonville, und das machte es damals nicht so beliebt. Es erfüllte die Erwartungen und bestand Oulus letzte Prüfung von C++17. Damit kann C++ problemlos bestimmte Anweisungsblöcke kompilieren lassen, wenn während der Kompilierung ein constexpr als wahr ausgewertet wird:

Dieses Beispiel explizit Wie bereits erwähnt, muss constexpr sein Wird während der Kompilierung als wahr beurteilt, hat aber keine Auswirkung auf static_assert. Nicht ausgewählte static_asserts im Anweisungsblock werden weiterhin ausgelöst. Dies ist für den Standard ungeeignet.
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: template6b4b5c6a4dca2aea2d2f974ee580bfa1.


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).


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn