C++20 standard godkÀnd

ISO C++ standardiseringskommittén 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 implementeras inom projektet. Boost.

Under de kommande tvÄ mÄnaderna kommer den godkÀnda specifikationen att vara i dokumentförberedelsefasen, dÀr redaktionellt arbete kommer att utföras för att korrigera stavfel och skrivfel. I början av november kommer den resulterande versionen av 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 förbÀttringar vid sitt nÀsta virtuella möte. innovationer.

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

  • "Koncept" har lagts till, malltillĂ€gg som lĂ„ter dig definiera en uppsĂ€ttning krav för mallparametrar som vid kompileringstid begrĂ€nsar uppsĂ€ttningen argument som kan accepteras som mallparametrar. Koncept kan anvĂ€ndas för att undvika logiska inkonsekvenser mellan egenskaperna för de datatyper som anvĂ€nds i en mall och egenskaperna för datatyperna för inparametrarna.

    mall
    konceptet LikhetJÀmförbar = krÀver(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Följande har antagits till sammansĂ€ttningen: expansionen för att arbeta med moduler, vilka kan anvĂ€ndas istĂ€llet för headerfiler. Moduler ger ett nytt sĂ€tt att organisera kĂ€llkod baserat pĂ„ definierade komponentgrĂ€nser, utan att headerfiler behöver inkluderas via "#include".
  • Makro __VA_OPT__ för adaptiv expansion av variadiska makron beroende pĂ„ förekomsten av tokens i det variadiska argumentet.
  • Stöd för operatorn "" för trevĂ€gsjĂ€mförelse.
  • Stöd för standardelementinitialiserare för bitfĂ€lt.
  • Möjlighet till lambda-insamling av "*this"-uttryck.

    struktur int_value {
    int n = 0;
    automatisk getter_fn() {
    // DÅLIGT:
    // returnera [=]() { returnera n; };

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

  • Pekare-till-medlem-Ă„tkomst med hjĂ€lp av pekare till temporĂ€ra objekt definierade via uttrycket "const &".
  • Delete-operatorn med en destructor som beskrivs i dokumentet P0722R1.
  • Klasser tillĂ„ts anvĂ€nda mallparametrar utan typ.

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

    mall
    automatiskt get_foo() {
    returnera f;
    }

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

  • Icke-persistenta lambda-uttryck med konstruktor.
  • TillĂ„telse för att anvĂ€nda mallsyntax för lambda-uttryck ('auto f = [] (std::vektor v)»).
  • Möjlighet att anvĂ€nda strĂ€ngliteraler i mallparametrar.
  • Stöd för initialiseringssyntax i C-stil – fĂ€lt som inte uttryckligen listas i initialiseringslistan initieras som standard.

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

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

  • Stöd för tomma medlemmar i datastrukturer.
  • Stöd för attributen sannolikt och osannolikt för att informera optimeraren om sannolikheten för att en villkorlig konstruktion utlöses ("[[sannolikt]] if (random > 0) {").
  • Möjlighet att anvĂ€nda intervall för att initiera variabelvĂ€rden i en for-loop

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

  • Automatisk berĂ€kning av arraystorlek i new ("new double[]{1,2,3}");
  • Attributet "[[no_unique_address]]" sĂ€kerstĂ€ller att 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.

    konstant int kvadrat(int n) {
    returnera n * n;
    }

    constexpr int r = kvadrat(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 char8_t-typen för UTF-8-strĂ€ngar.
    • Lade till bit (bitoperationer) och versionsheaderfiler.
    • Det Ă€r nu möjligt att kontrollera prefixet och suffixet för strĂ€ngar (börjar_med, slutar_med).
    • Lade till egenskaperna std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible och std::type_identity.
    • Lade till funktionerna 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 funktionen std::to_array för att konvertera array-liknande objekt till std::array.
  • En mer praktisk syntax för upprĂ€kningar:

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

    std::string_view to_string(rgba_color_channel my_channel) {
    byta (min_kanal) {
    anvÀnder enum rgba_color_channel;
    gemenrött: returnera "rött";
    gemen grönt: returnera "grönt";
    skiftlÀge blÄtt: returnera "blÄ";
    case alpha: returnera "alpha";
    }
    }

  • Operatorn "," ("a[b,c]") Ă€r inte lĂ€ngre tillĂ„ten i index pĂ„ grund av odefinierat beteende. De flesta operationer pĂ„ variabler som deklarerats med nyckelordet volatile stöds inte lĂ€ngre, inklusive operatorerna "++" och "—" pĂ„ standardtyper.
  • Minskade antalet situationer dĂ€r det krĂ€vs att "typnamn" anges för att indikera nĂ€rvaron av en typ.

KĂ€lla: opennet.ru

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster