Byl schválen standard C++20

Komitét ISO pro standardizaci jazyka C++ schválil mezinárodní standard „C++20“. Předložené možnosti ve specifikaci, s výjimkou jednotlivých případů, jsou podporovány v kompilátorech GCC, Clang a Microsoft Visual C++. Standardní knihovny podporující C++20 byly implementovány v rámci projektu Boost.

V následujících dvou měsících bude schválená specifikace podrobena přípravě dokumentu k publikaci, na které se provede práce na redakčním zpracování překlepů a chyb v pravopisu. Na začátku listopadu bude výsledná verze dokumentu zaslána ISO k publikaci pod formálním názvem ISO/IEC 14882:2020. Mezitím už komitét začal pracovat na dalším standardu C++23 (C++2b) a na nejbližším virtuálním zasedání projedná možné novinky.

Hlavní vlastnosti C++20 (příklady kódu):

  • Byly přidány „koncepty“, rozšíření šablon, které umožňují definovat soubor požadavků pro parametry šablony, které během kompilace omezují soubor argumentů, které mohou být přijaty jako parametry šablony. Koncepty lze uplatnit k tomu, aby se předešlo logickým nesrovnalostem mezi vlastnostmi datových typů používaných uvnitř šablony a vlastnostmi datových typů vstupních parametrů.

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

  • Byly přijaté rozšíření pro práci s moduly, které mohou být použity místo hlavičkových souborů. Moduly poskytují nový způsob organizace zdrojových textů na základě definice hranic komponent, bez připojovaných hlavičkových souborů přes „#include“.
  • Makro __VA_OPT__ pro adaptivní rozbalení variabilních maker v závislosti na přítomnosti tokenů ve variabilním argumentu.
  • Podpora operátoru „“ pro trojité porovnání.
  • Podpora inicializátorů prvků podle výchozích hodnot pro bitová pole.
  • Možnost lambda-zachycení výrazů „*this“.

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

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

  • Volání prvků podle ukazatele (Pointer-to-member) s použitím definovaných prostřednictvím výrazu „const &“ ukazatelů na dočasné objekty.
  • Operátor delete s destruktorem, popsaný v dokumentu P0722R1.
  • Třídám je dovoleno používat parametry šablony bez typu.

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

    template
    auto get_foo() {
    return f;
    }

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

  • Nepersistující lambda výrazy s konstruktorem.
  • Přípustnost použití syntaktických šablon pro lambda výrazy ("auto f = [](std::vector v)").
  • Možnost použití řetězcových literálů v šablonových parametrech.
  • Podpora syntaktického stylu inicializace v jazyce C — pole neexplicitně uvedená v seznamu inicializace se inicializují na výchozí hodnoty.

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

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

  • Podpora prázdných členů datových struktur.
  • Podpora atributů likely a unlikely pro informování optimalizátora o pravděpodobnosti vyhodnocení podmíněného výrazu ("[[likely]] if (random > 0) {").
  • Možnost použití rozsahů pro inicializaci hodnoty proměnné v cyklu "for"

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

  • Automatické určení velikosti pole v new ("new double[]{1,2,3}");
  • Atribut "[[no_unique_address]]", kdy proměnné bez dat nezabírají místo.
  • Atomické ukazatele (std::atomic<shared_ptr> a std::atomic<weak_ptr>).
  • Možnost volání virtuálních funkcí v podmíněných výrazech.
  • Podpora okamžitých funkcí, které mohou pracovat pouze s konstantami.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' nemůže být použit jako konstanta

  • Možnost aplikovat constexpr s virtuálními funkcemi ("constexpr virtual int f() const { return 2; }").
  • Ve standardní knihovně:
    • Byla přidána podpora typu char8_t pro UTF-8 řetězce.
    • Byly přidány hlavičkové soubory bit (bitové operace) a version.
    • Objevila se možnost ověřování prefixu a sufixu řetězců (starts_with, ends_with).
    • Byly přidány typy std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible a std::type_identity.
    • Byly přidány funkce std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated a std::assume_aligned.
    • V std::make_shared byla přidána podpora pro pole.
    • Byla přidána funkce std::to_array pro převod objektů podobných poli na std::array.
  • Pohodlnější syntaxe enumerací:

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

  • V indexech je zakázáno používat operaci „,“ („a[b,c]“) kvůli nejednoznačnému chování. Podpora většiny operací s proměnnými deklarovanými klíčovým slovem volatile byla ukončena, včetně zakázání operací „++“ a „—“ se standardními typy.
  • Bylo sníženo množství situací, ve kterých je nutné uvádět „typename“ pro oznámení o přítomnosti typu.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster