Standarden C++20 har godkÀnts

ISO-kommittén för standardisering av C++-sprÄket godkÀnde den internationella standarden "C++20". De funktioner som presenteras i specifikationen, med undantag för enstaka fall, av en mÀngd olika företag, inklusive Cisco, Google, Netflix, Microsoft och Mozilla. Samtidigt innebÀr programvarudekodning vanligtvis alltid ökad energiförbrukning och betydligt begrÀnsad anvÀndning. DÀrför Àr det intressant att titta pÄ stödet för hÄrdvarudekodning. i kompilatorer GCC, Clang och Microsoft Visual C++. Standardbiblioteken som stödjer C++20 har implementerats inom ramen för projektet Boost.

Under de kommande tvÄ mÄnaderna kommer den godkÀnda specifikationen att vara i förberedelsefasen för publicering, dÀr arbetet med att redigera stavfel och tryckfel kommer att genomföras. I början av november kommer den slutliga 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 standard C++23 (C++2b) och kommer att diskutera potentiella nyheter.

Huvud funktioner C++20 (kodexempel):

  • Koncept har lagts till, vilket Ă€r en utvidgning av mallar som gör det möjligt att definiera ett set av krav pĂ„ mallparameterar som begrĂ€nsar uppsĂ€ttningen av argument som kan tas emot som mallparametrar under kompileringen. Koncept kan anvĂ€ndas för att undvika logiska inkonsekvenser mellan egenskaperna hos datatyper som anvĂ€nds inom mallen och egenskaperna hos datatyperna för inparametrarna.

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

  • För att arbeta med moduler som kan anvĂ€ndas istĂ€llet för header-filer. Moduler erbjuder ett nytt sĂ€tt att organisera kĂ€llkod baserat pĂ„ definitioner av komponentgrĂ€nser, utan att anvĂ€nda inkluderade header-filer med "#include". tillĂ€gget Makrot __VA_OPT__ för adaptiv upplösning av variadikmakron beroende pĂ„ förekomsten av token i den variadiska parametern.
  • Stöd för operatorn "" för trevĂ€gsjĂ€mförelse.
  • Stöd för standardelements initialiserare för bitfĂ€lt.
  • Möjlighet till lambda-fĂ„ngst av uttrycket "*this".
  • struct int_value {

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

    // GOOD:
    Anrop av medlemmar via pekare (Pointer-to-member), med hjÀlp av pekare till temporÀra objekt definierade genom uttrycket "const &".
    }
    };

  • Delete-operator med destruktör som beskrivs i dokumentet
  • P0722R1 Klasser tillĂ„ts att anvĂ€nda mallparameterar utan typ..
  • struct foo {

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

    auto get_foo() {
    return f;
    get_foo(); // anvÀnder implicit konstruktor
    }

    get_foo();
    get_foo<foo{123}>();

  • Icke-sparade lambda-uttryck med konstruktor.
  • TillĂ€mpbarheten av mallsyntax för lambda-uttryck ("auto f = [](std::vector v)").
  • Möjlighet att anvĂ€nda strĂ€ngliteraler i mallparametrar.
  • Stöd för C-liknande initialiseringssyntax - fĂ€lt som inte anges i initialiseringslistan initieras som standard.

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

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

  • Stöd för tomma datamedlemmar.
  • Stöd för attributen likely och unlikely för att informera optimeraren om sannolikheten för att en villkorsstruktur intrĂ€ffar ("[[likely]] if (random > 0) {").
  • Möjlighet att anvĂ€nda intervall för att initiera vĂ€rden i en "for"-loop.

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

  • Automatisk berĂ€kning av storleken pĂ„ en array i new ("new double[]{1,2,3}");
  • Attributet "[[no_unique_address]]" dĂ€r variabler utan data inte tar upp plats.
  • Atomiska pekare (std::atomic<shared_ptr> och std::atomic<weak_ptr>).
  • Möjlighet att anropa virtuella funktioner i villkorsuttryck.
  • Stöd för omedelbara funktioner (immediate) som endast kan arbeta med konstantvĂ€rden.

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

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

  • Möjlighet att tillĂ€mpa constexpr med virtuella funktioner ("constexpr virtual int f() const { return 2; }").
  • I standardbiblioteket:
    • Stöd för typen char8_t för UTF-8-strĂ€ngar har lagts till.
    • Headerfilerna bit (bitoperationer) och version har lagts till.
    • Möjlighet att kontrollera prefix och suffix pĂ„ strĂ€ngar (starts_with, ends_with).
    • Typer som std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible och std::type_identity har lagts till.
    • Funktioner som std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated och std::assume_aligned har lagts till.
    • Support för arrayer har lagts till i std::make_shared.
    • Funktionen std::to_array för att konvertera array-liknande objekt till std::array har lagts till.
  • Mer anvĂ€ndarvĂ€nlig syntax för enumerationer:

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

  • I indexerna Ă€r anvĂ€ndningen av operationen «,» («a[b,c]») förbjuden pĂ„ grund av oförutsĂ€gbart beteende. Stödet för de flesta operationerna med variabler deklarerade med nyckelordet volatile har upphört, inklusive operationerna «++» och «—» med standardtyper.
  • Antalet situationer dĂ€r det krĂ€vs att ange «typename» för att informera om förekomsten av en typ har minskat.

KĂ€lla: opennet.ru

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