C++20 standard godkänd

ISO-kommittén för standardisering av C++-språket godkänd internationell standard "C ++ 20". De funktioner som presenteras i specifikationen, med undantag för enstaka fall, stöds i kompilatorer GCC, Klang и Microsoft Visual C ++. Standardbibliotek som stöder C++20 är implementerade i projektet Boost.

Under de kommande två månaderna kommer den godkända specifikationen att vara i förberedelsestadiet för dokumentet för publicering, där arbetet kommer att utföras med redaktionell korrigering av stavfel och stavfel. I början av november kommer det resulterande dokumentet att skickas till ISO för publicering under det formella namnet ISO/IEC 14882:2020. Under tiden har kommittén redan påbörjat arbetet med nästa C++23-standard (C++2b) och kommer att överväga möjliga alternativ vid sitt nästa virtuella möte. innovationer.

Den huvudsakliga särdrag C ++ 20 (kodexempel):

  • Lade till "koncept", malltillägg, som låter dig definiera en uppsättning mallparameterkrav som vid kompilering begränsar uppsättningen argument som kan accepteras som mallparametrar. Koncepten kan användas för att undvika logiska inkonsekvenser mellan egenskaperna för datatyperna som används i mallen och datatypegenskaperna för indataparametrarna.

    mall
    koncept JämlikhetComparable = kräver(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Accepterad expansionen för att arbeta med moduler som kan användas istället för header-filer. Moduler ger ett nytt sätt att organisera källkod baserat på att definiera komponenters gränser, utan att inkludera rubrikfiler via "#inkludera".
  • Makro __VA_OPT__ för adaptiv expansion av variabla makron beroende på förekomsten av tokens i variabelargumentet.
  • Stöd för ""-operatören för trevägsjämförelse.
  • Stöd för standardelementinitierare för bitfält.
  • Möjlighet att lambda fånga "*detta" uttryck.

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

    // BRA:
    return [=, *detta]() { return n; };
    }
    };

  • Anropa element med pekare (pekare-till-medlem), med hjälp av pekare till tillfälliga objekt definierade genom uttrycket "const &".
  • Raderingsoperatören med en destruktor som beskrivs i dokumentet P0722R1.
  • Klasser får använda mallparametrar utan typ.

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

    mall
    auto get_foo() {
    returnera f;
    }

    get_foo(); // använder implicit konstruktor
    get_foo ();

  • Icke-beständiga lambda-uttryck med konstruktor.
  • Tillåter mallsyntax för lambda-uttryck ("auto f = [] (std::vektor v)").
  • Möjlighet att använda strängliterals i mallparametrar.
  • Stöd för initieringssyntax i C-stil - fält som inte är explicit listade i initieringslistan initieras som standard.

    struktur A {
    intx;
    int y;
    int z = 123;
    };

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

  • Stöd för tomma datastrukturmedlemmar.
  • Stöd för de sannolika och osannolika attributen för att informera optimeraren om sannolikheten för att den villkorliga konstruktionen utlöses ("[[sannolikt]] om (slumpmässigt > 0) {").
  • Möjlighet att använda intervall för att initiera variabelvärden i en "för"-loop

    för (auto v = std::vektor{1, 2, 3}; auto& e: v) {

  • Automatisk beräkning av arraystorlek i ny ("ny dubbel[]{1,2,3}");
  • Attributet "[[no_unique_address]]" där variabler utan data inte tar upp plats.
  • Atompekare (std::atomic > och std::atomic >).
  • Möjlighet att anropa virtuella funktioner i villkorliga uttryck.
  • Stöd för omedelbara funktioner som bara kan fungera med konstanter.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // FEL: 'x' kan inte användas som en konstant

  • Möjlighet att använda constexpr med virtuella funktioner ("constexpr virtual int f() const { return 2; }").
  • I standardbiblioteket:
    • Lade till stöd för typen char8_t för UTF-8-strängar.
    • Lade till rubrikfiler bit (bitoperationer) och version.
    • Det är nu möjligt att kontrollera prefixet och suffixet för strängar (starts_with, ends_with).
    • Lade till std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible och std::type_identity-egenskaper.
    • Lade till funktioner std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated och std::assume_aligned.
    • Lade till stöd för arrayer till std::make_shared.
    • Lade till std::to_array-funktion för att konvertera arrayliknande objekt till std::array.
  • Bekvämare uppräkningssyntax:

    enum klass rgba_color_channel { röd, grön, blå, alfa };

    std::string_view to_string(rgba_color_channel my_channel) {
    switch (min_kanal) {
    använder enum rgba_color_channel;
    case red: returnera "röd";
    fallet grönt: returnera "grönt";
    case blue: returnera "blå";
    case alpha: returnera "alpha";
    }
    }

  • I index, på grund av odefinierat beteende, är användningen av operationen "," ("a[b,c]") förbjuden. Stöd för de flesta operationer med variabler deklarerade med det flyktiga nyckelordet har upphört, inklusive "++" och "—" operationerna med standardtyper.
  • Minskade antalet situationer där "typnamn" krävs för att indikera närvaron av en typ.

Källa: opennet.ru

Lägg en kommentar