Das ISO-Komitee hat den Standard "C ++ 20" genehmigt





Kürzlich hat das ISO-Komitee für die Standardisierung der C ++ - Sprache (ja, es gibt eine) den internationalen Standard "C ++ 20" genehmigt . Die in der Spezifikation enthaltenen Funktionen werden von den Compilern GCC, Clang und Microsoft Visual C ++ unterstützt. Darüber hinaus sind im Boost-Projekt Standardbibliotheken mit Unterstützung für "C ++ 20" implementiert.



Der nächste Schritt ist die Vorbereitung des Dokuments zur Veröffentlichung. Anfang November wird dann die endgültige Version an ISO gesendet, wonach sie unter dem offiziellen Namen ISO / IEC 14882: 2020 veröffentlicht wird. Das Komitee arbeitet bereits am nächsten Standard, C ++ 23 (C ++ 2b). Unter den Schnittfunktionen von "C ++ 20" mit Codebeispielen.



Was gibt's Neues?



Das Komitee fügte "Konzepte" hinzu , Vorlagenerweiterungen, mit denen Sie eine Reihe von Anforderungen für Vorlagenparameter definieren können. Zur Kompilierungszeit beschränken sie die Menge der Argumente, die als Vorlagenparameter akzeptiert werden können. Die Konzepte ermöglichen es, logische Inkonsistenzen zwischen den Eigenschaften der in der Vorlage verwendeten Datentypen und den Eigenschaften der Datentypen der Eingabeparameter zu vermeiden.



 template<typename T>
   concept EqualityComparable = requires(T a, T b) {
       { a == b } -> std::boolean;
       { a != b } -> std::boolean;
   };


Akzeptierte Erweiterung für die Arbeit mit den Modulen. Sie können anstelle von Header-Dateien verwendet werden. Module bieten eine neue Möglichkeit, Quellen basierend auf der Definition von Komponentengrenzen zu organisieren, ohne Header-Dateien mit "#include" einzuschließen. __VA_OPT__



Makro zur adaptiven Erweiterung variadischer Makros in Abhängigkeit vom Vorhandensein von Token im variadischen Argument hinzugefügt.



Unterstützung für den Operator <=> für den Drei-Wege-Vergleich hinzugefügt . Standardelementinitialisierer für Bitfelder werden



unterstützt .



Es wurde die Möglichkeit hinzugefügt , Lambda-Ausdrücke * zu erfassen.



   struct int_value {
     int n = 0;
     auto getter_fn() {
       // BAD:
       // return [=]() { return n; };
 
       // GOOD:
       return [=, *this]() { return n; };
     }
   };
 


Klassen können jetzt typenlose Vorlagenparameter verwenden.



   struct foo {
     foo() = default;
     constexpr foo(int) {}
   };
 
   template <foo f>
   auto get_foo() {
     return f; 
   }
 
   get_foo(); // uses implicit constructor
   get_foo<foo{123}>();


Jetzt können Sie Zeichenfolgenliterale in Vorlagenparametern verwenden. Die Initialisierungssyntax im C-Stil wird unterstützt. Diejenigen, die nicht explizit in den Feldinitialisierungslisten aufgeführt sind, werden standardmäßig initialisiert.



struct A {
     int x;
     int y;
     int z = 123;
   };
 
   A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2


Leere Mitglieder von Datenstrukturen werden unterstützt.



Die wahrscheinlichen und unwahrscheinlichen Attribute werden unterstützt , um den Optimierer über die Wahrscheinlichkeit des Auslösens des bedingten Konstrukts zu informieren ("[[wahrscheinlich]] if (random> 0) {").



Jetzt können Sie Bereiche verwenden, um Variablenwerte in einer for-Schleife zu initialisieren



   for (auto v = std::vector{1, 2, 3}; auto& e : v) {


Es werden Sofortfunktionen unterstützt , die nur mit Konstanten arbeiten können.



 consteval int sqr(int n) {
     return n * n;
   }
 
   constexpr int r = sqr(100); // OK
   int x = 100;
   int r2 = sqr(x); // ERROR:  'x'     


Zur Bibliothek hinzugefügt:

  • Unterstützung für den Typ char8_t für UTF-8-Zeichenfolgen.
  • Header-Bit (Bitoperationen) und Version.
  • die Möglichkeit, das Präfix und Suffix von Zeichenfolgen zu überprüfen (Start_mit, Ende_mit).
  • Merkmale std :: remove_cvref, std :: unwrap_reference, std :: unwrap_decay_ref, std :: is_nothrow_convertible und std :: type_identity.
  • die Funktionen std :: midpoint, std :: lerp, std :: bind_front, std :: source_location, std :: visit, std :: is_constant_evaluated und std :: accept_aligned.
  • Unterstützung für Arrays in std :: make_shared.
  • std :: to_array Funktion zum Konvertieren von Array-ähnlichen Objekten in std :: Array.


Die Aufzählungssyntax ist jetzt bequemer:

   enum class rgba_color_channel { red, green, blue, alpha };
 
   std::string_view to_string(rgba_color_channel my_channel) {
     switch (my_channel) {
       using enum rgba_color_channel;
       case red:   return "red";
       case green: return "green";
       case blue:  return "blue";
       case alpha: return "alpha";
    }
   }


Es ist verboten, die Operationen "," ("a [b, c]") in Indizes zu verwenden . Die meisten Operationen für Variablen, die mit dem Schlüsselwort violate deklariert wurden, einschließlich der verbotenen ++ und - Operationen für Standardtypen, werden nicht unterstützt.






All Articles