C++20 standard odobren

ISO Odbor za standardizaciju jezika C++ odobreno međunarodni standard"C ++ 20". Mogućnosti predstavljene u specifikaciji, s izuzetkom izoliranih slučajeva, podržavao u kompajlerima GCC, Zveckanje и Microsoft Visual C ++. U okviru projekta implementirane su standardne biblioteke koje podržavaju C++20 Pojačati.

U sljedeća dva mjeseca odobrena specifikacija bit će u fazi pripreme dokumenta za objavu, pri čemu će se raditi na redakcijskim ispravcima pravopisnih i tiskarskih pogrešaka. Početkom studenog dobiveni dokument bit će poslan ISO-u na objavu pod formalnim nazivom ISO/IEC 14882:2020. U međuvremenu, odbor je već započeo rad na sljedećem standardu C++23 (C++2b) i razmotrit će moguće opcije na sljedećem virtualnom sastanku. inovacije.

Glavni značajke C ++ 20 (primjeri kodova):

  • Dodani "koncepti", proširenja predloška, ​​koji vam omogućuju definiranje skupa zahtjeva za parametre predloška koji, tijekom kompilacije, ograničavaju skup argumenata koji se mogu prihvatiti kao parametri predloška. Koncepti se mogu koristiti za izbjegavanje logičkih nedosljednosti između svojstava tipova podataka korištenih unutar predloška i svojstava tipa podataka ulaznih parametara.

    šablona
    koncept JednakostUporediva = zahtijeva (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Prihvaćeno proširenje za rad s modulima koji se mogu koristiti umjesto datoteka zaglavlja. Moduli pružaju novi način organiziranja izvornog koda na temelju definiranja granica komponenti, bez uključivanja datoteka zaglavlja putem "#include".
  • Makro __VA_OPT__ za prilagodljivo proširenje makronaredbi varijable ovisno o prisutnosti tokena u argumentu varijable.
  • Podrška za operator "" za trosmjernu usporedbu.
  • Podrška za zadane inicijalizatore elemenata za bitna polja.
  • Sposobnost lambda snimanja "*this" izraza.

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

    // DOBRO:
    return [=, *ovo]() { return n; };
    }
    };

  • Pozivanje elemenata pomoću pokazivača (Pointer-to-member), koristeći pokazivače na privremene objekte definirane kroz izraz "const &".
  • Operator brisanja s destruktorom opisan u dokumentu P0722R1.
  • Klasama je dopušteno koristiti parametre predloška bez tipa.

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

    šablona
    auto get_foo() {
    povratak f;
    }

    get_foo(); // koristi implicitni konstruktor
    get_foo ();

  • Nepostojani lambda izrazi s konstruktorom.
  • Dopuštanje sintakse predloška za lambda izraze (“auto f = [] (std::vektor v)").
  • Sposobnost korištenja string literala u parametrima predloška.
  • Podrška za sintaksu inicijalizacije u stilu C - polja koja nisu eksplicitno navedena na popisu inicijalizacije inicijaliziraju se prema zadanim postavkama.

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

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

  • Podrška za prazne članove strukture podataka.
  • Podrška za vjerojatne i malo vjerojatne atribute za informiranje optimizatora o vjerojatnosti pokretanja uvjetne konstrukcije (“[[vjerojatno]] ako (slučajno > 0) {“).
  • Sposobnost korištenja raspona za inicijalizaciju vrijednosti varijable u petlji "za".

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

  • Automatski izračun veličine niza u new (“new double[]{1,2,3}”);
  • Atribut “[[no_unique_address]]” u kojem varijable bez podataka ne zauzimaju prostor.
  • Atomski pokazivači (std::atomic > i std::atomic >).
  • Sposobnost poziva virtualnih funkcija u uvjetnim izrazima.
  • Podrška za neposredne funkcije koje mogu raditi samo s konstantama.

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

    constexpr int r = sqr(100); // U REDU
    int x = 100;
    int r2 = sqr(x); // POGREŠKA: 'x' se ne može koristiti kao konstanta

  • Mogućnost korištenja constexpr s virtualnim funkcijama (“constexpr virtual int f() const { return 2; }”).
  • U standardnoj knjižnici:
    • Dodana podrška za tip char8_t za nizove UTF-8.
    • Dodan bit datoteke zaglavlja (operacije s bitovima) i verzija.
    • Sada je moguće provjeriti prefiks i sufiks nizova (starts_with, ends_with).
    • Dodane značajke std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity.
    • Dodane su funkcije std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated i std::assume_aligned.
    • Dodana podrška za nizove u std::make_shared.
    • Dodana funkcija std::to_array za pretvaranje objekata sličnih nizu u std::array.
  • Pogodnija sintaksa nabrajanja:

    enum class rgba_color_channel { red, green, blue, alpha };

    std::string_view to_string(rgba_color_channel moj_kanal) {
    prebaci (moj_kanal) {
    koristeći enum rgba_color_channel;
    slučaj crveno: vrati "crveno";
    velika i mala slova zelena: vrati "zeleno";
    case blue: vrati "plavo";
    slučaj alfa: vrati "alfa";
    }
    }

  • U indeksima je zbog nedefiniranog ponašanja zabranjena uporaba operacije “,” (“a[b,c]”). Podrška za većinu operacija s varijablama deklariranim ključnom riječi volatile je ukinuta, uključujući operacije “++” i “—” sa standardnim tipovima.
  • Smanjen je broj situacija u kojima je "typename" potreban za označavanje prisutnosti tipa.

Izvor: opennet.ru

Dodajte komentar