C++20-Standard genehmigt

ISO-Komitee zur Standardisierung der C++-Sprache genehmigt internationaler Standard "C ++ 20". Die in der Spezifikation dargestellten Fähigkeiten, mit Ausnahme von Einzelfällen, unterstützt in Compilern GCC, Clang и Microsoft Visual C ++. Im Projekt sind Standardbibliotheken implementiert, die C++20 unterstützen Boost.

In den nächsten zwei Monaten wird sich die genehmigte Spezifikation in der Phase der Vorbereitung des Dokuments für die Veröffentlichung befinden, in der an der redaktionellen Korrektur von Rechtschreib- und Tippfehlern gearbeitet wird. Anfang November wird das resultierende Dokument zur Veröffentlichung unter dem offiziellen Namen ISO/IEC 14882:2020 an ISO gesendet. Mittlerweile hat das Gremium bereits mit der Arbeit am nächsten C++23-Standard (C++2b) begonnen und wird bei seiner nächsten virtuellen Sitzung mögliche Optionen prüfen. Innovationen.

Haupt- eigenschaften C ++ 20 (Codebeispiele):

  • „Konzepte“, Vorlagenerweiterungen, hinzugefügt, mit denen Sie eine Reihe von Vorlagenparameteranforderungen definieren können, die zur Kompilierungszeit die Menge der Argumente einschränken, die als Vorlagenparameter akzeptiert werden können. Mithilfe der Konzepte können logische Inkonsistenzen zwischen den Eigenschaften der in der Vorlage verwendeten Datentypen und den Datentypeigenschaften der Eingabeparameter vermieden werden.

    Vorlage
    Konzept EqualityComparable = erfordert(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Akzeptiert Erweiterungen zum Arbeiten mit Modulen, die anstelle von Header-Dateien verwendet werden können. Module bieten eine neue Möglichkeit, Quellcode basierend auf der Definition der Grenzen von Komponenten zu organisieren, ohne Header-Dateien über „#include“ einzubinden.
  • Makro __VA_OPT__ zur adaptiven Erweiterung variabler Makros abhängig vom Vorhandensein von Token im Variablenargument.
  • Unterstützung für den „“-Operator für Drei-Wege-Vergleiche.
  • Unterstützung für Standardelementinitialisierer für Bitfelder.
  • Möglichkeit zur Lambda-Erfassung von „*this“-Ausdrücken.

    struct int_value {
    intn = 0;
    auto getter_fn() {
    //SCHLECHT:
    // return [=]() { return n; };

    // GUT:
    return [=, *this]() { return n; };
    }
    };

  • Aufrufen von Elementen per Zeiger (Pointer-to-Member) unter Verwendung von Zeigern auf temporäre Objekte, die durch den Ausdruck „const &“ definiert werden.
  • Der Löschoperator mit einem im Dokument beschriebenen Destruktor P0722R1.
  • Klassen dürfen Vorlagenparameter ohne Typ verwenden.

    struct foo {
    foo() = Standard;
    constexpr foo(int) {}
    };

    Vorlage
    auto get_foo() {
    zurück f;
    }

    get_foo(); // verwendet impliziten Konstruktor
    get_foo ();

  • Nicht persistente Lambda-Ausdrücke mit Konstruktor.
  • Zulassen der Vorlagensyntax für Lambda-Ausdrücke („auto f = [] (std::vector v)“).
  • Möglichkeit zur Verwendung von Zeichenfolgenliteralen in Vorlagenparametern.
  • Unterstützung für die Initialisierungssyntax im C-Stil – Felder, die nicht explizit in der Initialisierungsliste aufgeführt sind, werden standardmäßig initialisiert.

    strukturiere A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2

  • Unterstützung für leere Datenstrukturelemente.
  • Unterstützung für die Attribute „wahrscheinlich“ und „unwahrscheinlich“, um den Optimierer über die Wahrscheinlichkeit der Auslösung des bedingten Konstrukts zu informieren („[[likely]] if (random > 0) {“).
  • Möglichkeit, Bereiche zu verwenden, um Variablenwerte in einer „for“-Schleife zu initialisieren

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

  • Automatische Berechnung der Array-Größe in new („new double[]{1,2,3}“);
  • Das „[[no_unique_address]]“-Attribut, in dem Variablen ohne Daten keinen Platz beanspruchen.
  • Atomare Zeiger (std::atomic > und std::atomic >).
  • Möglichkeit, virtuelle Funktionen in bedingten Ausdrücken aufzurufen.
  • Unterstützung für unmittelbare Funktionen, 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); // FEHLER: 'x' kann nicht als Konstante verwendet werden

  • Möglichkeit der Verwendung von constexpr mit virtuellen Funktionen („constexpr virtual int f() const { return 2; }“).
  • In der Standardbibliothek:
    • Unterstützung für den Typ char8_t für UTF-8-Zeichenfolgen hinzugefügt.
    • Header-Dateien Bit (Bit-Operationen) und Version hinzugefügt.
    • Es ist jetzt möglich, das Präfix und Suffix von Zeichenfolgen (starts_with, end_with) zu überprüfen.
    • Die Merkmale std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible und std::type_identity wurden hinzugefügt.
    • Funktionen std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated und std::assume_aligned hinzugefügt.
    • Unterstützung für Arrays zu std::make_shared hinzugefügt.
    • Funktion std::to_array hinzugefügt, um Array-ähnliche Objekte in std::array zu konvertieren.
  • Bequemere Aufzählungssyntax:

    enum class rgba_color_channel { red, green, blue, alpha };

    std::string_view to_string(rgba_color_channel my_channel) {
    switch (my_channel) {
    mit enum rgba_color_channel;
    case red: Rückgabe von „red“;
    Fall grün: Rückgabe „grün“;
    Fall blau: Rückgabe „blau“;
    Fall Alpha: Rückgabe von „Alpha“;
    }
    }

  • In Indizes ist aufgrund undefinierten Verhaltens die Verwendung der Operation „“, („a[b,c]“) verboten. Die Unterstützung für die meisten Operationen mit Variablen, die mit dem Schlüsselwort volatile deklariert wurden, wurde eingestellt, einschließlich der Operationen „++“ und „—“ mit Standardtypen.
  • Die Anzahl der Situationen, in denen „Typname“ erforderlich ist, um das Vorhandensein eines Typs anzuzeigen, wurde reduziert.

Source: opennet.ru

Kommentar hinzufügen