Schváleno standardem C++20

Výbor ISO pro standardizaci jazyka C++ schválený mezinárodní standard "C ++ 20". Schopnosti uvedené ve specifikaci, s výjimkou ojedinělých případů, podporováno v kompilátorech GCC, Zvonit и Microsoft Visual C ++. V rámci projektu jsou implementovány standardní knihovny podporující C++20 zesílení.

Schválená specifikace bude v následujících dvou měsících ve fázi přípravy dokumentu k publikaci, kdy se bude pracovat na redakční opravě pravopisných chyb a překlepů. Začátkem listopadu bude výsledný dokument zaslán ISO ke zveřejnění pod formálním názvem ISO/IEC 14882:2020. Mezitím již komise začala pracovat na dalším standardu C++23 (C++2b) a na svém příštím virtuálním setkání zváží možné varianty. inovace.

hlavní Rysy C ++ 20 (příklady kódu):

  • Přidány "koncepty", rozšíření šablon, které umožňují definovat sadu požadavků na parametry šablony, které v době kompilace omezují sadu argumentů, které lze přijmout jako parametry šablony. Tyto koncepty lze použít k zamezení logických nesrovnalostí mezi vlastnostmi datových typů použitých v šabloně a vlastnostmi datových typů vstupních parametrů.

    šablona
    koncept RovnostPorovnatelné = vyžaduje(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Přijato rozšíření pro práci s moduly, které lze použít místo hlavičkových souborů. Moduly poskytují nový způsob, jak organizovat zdrojový kód na základě definování hranic komponent, bez zahrnutí hlavičkových souborů pomocí „#include“.
  • Makro __VA_OPT__ pro adaptivní rozšíření proměnných maker v závislosti na přítomnosti tokenů v argumentu proměnné.
  • Podpora operátoru "" pro třícestné srovnání.
  • Podpora výchozích inicializátorů prvků pro bitová pole.
  • Schopnost lambda zachytit "*toto" výrazy.

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

    // DOBRÝ:
    return [=, *toto]() { return n; };
    }
    };

  • Volání prvků ukazatelem (Pointer-to-member) pomocí ukazatelů na dočasné objekty definované pomocí výrazu „const &“.
  • Operátor delete s destruktorem popsaným v dokumentu P0722 R1.
  • Třídy mohou používat parametry šablony bez typu.

    struct foo {
    foo() = výchozí;
    constexpr foo(int) {}
    };

    šablona
    auto get_foo() {
    návrat f;
    }

    get_foo(); // používá implicitní konstruktor
    get_foo ();

  • Neperzistentní výrazy lambda s konstruktorem.
  • Povolení syntaxe šablony pro výrazy lambda („auto f = [] (std::vektor proti)").
  • Schopnost používat řetězcové literály v parametrech šablony.
  • Podpora inicializační syntaxe ve stylu C – pole, která nejsou explicitně uvedena v inicializačním seznamu, jsou ve výchozím nastavení inicializována.

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

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

  • Podpora pro prázdné členy datové struktury.
  • Podpora pro pravděpodobné a nepravděpodobné atributy pro informování optimalizátoru o pravděpodobnosti spuštění podmíněného konstruktu („[[pravděpodobné]], pokud (náhodné > 0) {“).
  • Schopnost používat rozsahy k inicializaci hodnot proměnných ve smyčce „for“.

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

  • Automatický výpočet velikosti pole v novém („new double[]{1,2,3}“);
  • Atribut „[[no_unique_address]]“, ve kterém proměnné bez dat nezabírají místo.
  • Atomové ukazatele (std::atomic > a std::atomic >).
  • Schopnost volat virtuální funkce v podmíněných výrazech.
  • Podpora okamžitých funkcí, které mohou pracovat pouze s konstantami.

    consteval int sqr(int n) {
    návrat n * n;
    }

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // CHYBA: 'x' nelze použít jako konstantu

  • Možnost použití constexpr s virtuálními funkcemi („constexpr virtual int f() const { return 2; }“).
  • Ve standardní knihovně:
    • Přidána podpora pro typ char8_t pro řetězce UTF-8.
    • Přidán bit hlavičkových souborů (bitové operace) a verze.
    • Nyní je možné kontrolovat předponu a příponu řetězců (začíná_čím, končí_čím).
    • Přidány vlastnosti std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible a std::type_identity traits.
    • Přidány funkce std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated a std::assume_aligned.
    • Přidána podpora pro pole do std::make_shared.
    • Přidána funkce std::to_array pro převod objektů podobných poli na std::array.
  • Pohodlnější syntaxe výčtu:

    enum class rgba_color_channel { červená, zelená, modrá, alfa };

    std::string_view to_string(rgba_color_channel můj_kanál) {
    switch (my_channel) {
    pomocí enum rgba_color_channel;
    případ červená: návrat "červená";
    případ zelená: návrat "zelená";
    případ modrý: návrat "modrý";
    případ alfa: návrat "alfa";
    }
    }

  • V indexech je z důvodu nedefinovaného chování použití operace „,“ („a[b,c]“) zakázáno. Podpora většiny operací s proměnnými deklarovanými pomocí klíčového slova volatile byla ukončena, včetně operací „++“ a „—“ se standardními typy.
  • Snížil se počet situací, ve kterých je vyžadováno "typename" k označení přítomnosti typu.

Zdroj: opennet.ru

Přidat komentář