C++20 standard godkjent

ISO-komité for standardisering av C++-språket godkjent Internasjonal standard "C ++ 20". Mulighetene presentert i spesifikasjonen, med unntak av isolerte tilfeller, støttes i kompilatorer GCC, klang и Microsoft Visual C ++. Standardbiblioteker som støtter C++20 er implementert i prosjektet Øke.

I løpet av de neste to månedene vil den godkjente spesifikasjonen være på stadiet for å forberede dokumentet for publisering, hvor det vil bli arbeidet med redaksjonell retting av stavefeil og skrivefeil. I begynnelsen av november vil det resulterende dokumentet bli sendt til ISO for publisering under det formelle navnet ISO/IEC 14882:2020. I mellomtiden har komiteen allerede begynt arbeidet med neste C++23-standard (C++2b) og vil vurdere mulige alternativer på sitt neste virtuelle møte. innovasjoner.

Den viktigste Spesifikasjoner C ++ 20 (kodeeksempler):

  • Lagt til "konsepter", malutvidelser, som lar deg definere et sett med malparameterkrav som på kompileringstidspunktet begrenser settet med argumenter som kan aksepteres som malparametere. Konseptene kan brukes for å unngå logiske inkonsekvenser mellom egenskapene til datatypene som brukes i malen og datatypeegenskapene til inngangsparameterne.

    mal
    konsept LikhetSammenlignbar = krever(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Akseptert utvidelse for arbeid med moduler som kan brukes i stedet for overskriftsfiler. Moduler gir en ny måte å organisere kildekoden på basert på å definere grensene for komponenter, uten å inkludere overskriftsfiler via "#inkludere".
  • Makro __VA_OPT__ for adaptiv utvidelse av variable makroer avhengig av tilstedeværelsen av tokens i variabelargumentet.
  • Støtte for ""-operatøren for treveis sammenligning.
  • Støtte for standardelementinitialiserere for bitfelt.
  • Evne til å lambdafange "*dette" uttrykk.

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

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

  • Kalle opp elementer med peker (peker-til-medlem), ved hjelp av pekere til midlertidige objekter definert gjennom "const &"-uttrykket.
  • Slette-operatøren med en destruktor beskrevet i dokumentet P0722R1.
  • Klasser har lov til å bruke malparametere uten en type.

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

    mal
    auto get_foo() {
    returnere f;
    }

    get_foo(); // bruker implisitt konstruktør
    get_foo ();

  • Ikke-vedvarende lambda-uttrykk med konstruktør.
  • Tillater malsyntaks for lambda-uttrykk ("auto f = [] (std::vektor v)").
  • Evne til å bruke strengliteraler i malparametere.
  • Støtte for initialiseringssyntaks i C-stil - felt som ikke er eksplisitt oppført i initialiseringslisten, initialiseres som standard.

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

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

  • Støtte for tomme datastrukturmedlemmer.
  • Støtte for sannsynlige og usannsynlige attributter for å informere optimalisereren om sannsynligheten for at den betingede konstruksjonen utløses ("[[sannsynlig]] hvis (tilfeldig > 0) {").
  • Evne til å bruke områder for å initialisere variabelverdier i en "for"-løkke

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

  • Automatisk beregning av matrisestørrelse i ny ("ny dobbel[]{1,2,3}");
  • «[[no_unique_address]]»-attributtet der variabler uten data ikke tar opp plass.
  • Atompekere (std::atomic > og std::atomic >).
  • Evne til å kalle virtuelle funksjoner i betingede uttrykk.
  • Støtte for umiddelbare funksjoner som kun kan fungere med konstanter.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // FEIL: 'x' kan ikke brukes som konstant

  • Mulighet for å bruke constexpr med virtuelle funksjoner ("constexpr virtual int f() const { return 2; }").
  • I standardbiblioteket:
    • Lagt til støtte for char8_t-typen for UTF-8-strenger.
    • Lagt til overskriftsfiler bit (bitoperasjoner) og versjon.
    • Det er nå mulig å sjekke prefikset og suffikset til strenger (starter_med, slutter_med).
    • Lagt til std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible og std::type_identity-trekk.
    • Lagt til funksjoner std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated og std::assume_aligned.
    • Lagt til støtte for arrays til std::make_shared.
    • Lagt til std::to_array-funksjon for å konvertere array-lignende objekter til std::array.
  • Mer praktisk oppregningssyntaks:

    enum klasse rgba_color_channel { rød, grønn, blå, alfa };

    std::string_view to_string(rgba_color_channel my_channel) {
    bytte (min_kanal) {
    bruker enum rgba_color_channel;
    case rød: returner "rød";
    grønn sak: returner "grønn";
    case blue: returner "blå";
    case alpha: returner "alpha";
    }
    }

  • I indekser, på grunn av udefinert oppførsel, er bruk av operasjonen "," ("a[b,c]") forbudt. Støtte for de fleste operasjoner med variabler deklarert med det flyktige nøkkelordet har blitt avviklet, inkludert "++" og "—" operasjonene med standardtyper.
  • Redusert antall situasjoner der "typenavn" kreves for å indikere tilstedeværelsen av en type.

Kilde: opennet.ru

Legg til en kommentar