De C++20 standaard is goedgekeurd

De ISO-commissie voor de standaardisering van de C++-taal approved internationale standaard “C++20“. De in de specificatie gepresenteerde mogelijkheden, met uitzondering van enkelvoudige gevallen, ondersteund in de compilers GCC, Clang en Microsoft Visual C++. De bibliotheken die de C++20-standaard ondersteunen, zijn gerealiseerd binnen het project Boost.

In de komende twee maanden zal de goedgekeurde specificatie zich in de fase van documentvoorbereiding voor publicatie bevinden, waarin redactionele correcties van spelling- en typfouten zullen worden uitgevoerd. Begin november zal de resulterende versie van het document naar ISO worden gestuurd voor publicatie onder de formele naam ISO/IEC 14882:2020. In de tussentijd is de commissie al begonnen met het werk aan de volgende standaard C++23 (C++2b) en zal tijdens de eerstvolgende virtuele vergadering mogelijke vernieuwingen.

Belangrijkste kenmerken C++20 (codevoorbeelden):

  • ‘concepten’ zijn toegevoegd, uitbreidingen van sjablonen die een set vereisten voor sjabloonparameters definiëren, die tijdens de compilatie de set argumenten beperken die als sjabloonparameters kunnen worden geaccepteerd. Concepten kunnen worden toegepast om logische inconsistenties tussen de eigenschappen van datatypes die binnen het sjabloon worden gebruikt, en de eigenschappen van datatypes van de invoerparameters te vermijden.

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

  • De aangenomen de extensie voor gebruik met modules, die in plaats van headerbestanden kunnen worden gebruikt. Modules bieden een nieuwe manier om bront teksten te organiseren op basis van het definiëren van de grenzen van componenten, zonder de via “#include” ingevoegde headerbestanden.
  • De macro __VA_OPT__ voor adaptieve expansie van variabele macro's afhankelijk van de aanwezigheid van tokens in het variabele argument.
  • Ondersteuning voor de operator “” voor drieledige vergelijkingen.
  • Ondersteuning voor standaard initiators voor bitvelden.
  • De mogelijkheid om lambda's expressies “*this” te vangen.

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

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

  • Toegang tot leden via pointer-to-member, gebruikmakend van via de expressie “const &” gedefinieerde pointers naar tijdelijke objecten.
  • De delete-operator met een destructor, beschreven in het document P0722R1.
  • Klassen is toegestaan om sjabloonparameters zonder type te gebruiken.

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // gebruikt impliciete constructor
    get_foo();

  • Niet-opgeslagen lambda-expressies met een constructor.
  • Toegestaan gebruik van template-syntaxis voor lambda-expressies ("auto f = [<typename T>(std::vector<T> v)").
  • Mogelijkheid om stringliteralen in sjabloonparameters te gebruiken.
  • Ondersteuning voor C-stijl initialisatiesyntax — expliciet niet in de initialisatielijst vermelde velden worden standaard geïnitialiseerd.

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

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

  • Ondersteuning voor lege leden in datastructuren.
  • Ondersteuning voor de likely- en unlikely-attributen om de optimizer te informeren over de waarschijnlijkheid van voorwaardelijke constructies ("[[likely]] if (random > 0) {").
  • Mogelijkheid om bereiken te gebruiken voor het initialiseren van variabele waarden in een "for"-lus.

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

  • Automatische berekening van de arraygrootte in new ("new double[]{1,2,3}");
  • Attribuut "[[no_unique_address]]" waarvoor variabelen zonder gegevens geen ruimte innemen.
  • Atomische aanwijzers (std::atomic<shared_ptr<T>> en std::atomic<weak_ptr<T>>).
  • Mogelijkheid om virtuele functies aan te roepen in voorwaardelijke expressies.
  • Ondersteuning voor directe (immediate) functies die alleen met constanten kunnen werken.

    consteval int sqr(int n) {
    return n * n;
    }

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' kan niet als constante worden gebruikt.

  • Mogelijkheid om constexpr toe te passen met virtuele functies ("constexpr virtual int f() const { return 2; }").
  • In de standaardbibliotheek:
    • Ondersteuning voor het type char8_t voor UTF-8 strings is toegevoegd.
    • Headerbestanden bit (bitbewerkingen) en version zijn toegevoegd.
    • Mogelijkheid om prefix en suffix van strings te controleren (starts_with, ends_with).
    • Typen std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible en std::type_identity zijn toegevoegd.
    • Functies std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated en std::assume_aligned zijn toegevoegd.
    • Ondersteuning voor arrays is toegevoegd aan std::make_shared.
    • De functie std::to_array is toegevoegd voor het converteren van array-achtige objecten naar std::array.
  • Meer handige syntaxis voor enumeraties:

    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";
    }
    }

  • In de indexen is het gebruik van de operatie «,» («a[b,c]») verboden vanwege onvoorspelbaar gedrag. De ondersteuning van de meeste operaties met variabelen die zijn verklaard met het sleutelwoord volatile is stopgezet, waaronder de operaties «++» en «—» met standaardtypen.
  • Het aantal situaties waarin «typename» moet worden opgegeven om het bestaan van een type aan te geven, is verminderd.

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster