Zatwierdzono standard C++20

Komitet ISO ds. standaryzacji języka C++ zatwierdził międzynarodowy standard „C++20„. Przedstawione w specyfikacji możliwości, z wyjątkiem pojedynczych przypadków, są wspierane w kompilatorach GCC, Clang i Microsoft Visual C++. Wspierające C++20 standardowe biblioteki zostały zrealizowane w ramach projektu Boost.

W ciągu najbliższych dwóch miesięcy zatwierdzona specyfikacja będzie znajdować się na etapie przygotowania dokumentu do publikacji, podczas którego zostanie przeprowadzona praca redaktorska nad ortograficznymi błędami i literówkami. Na początku listopada ostateczna wersja dokumentu zostanie przesłana do ISO w celu publikacji pod formalną nazwą ISO/IEC 14882:2020. W międzyczasie komitet już rozpoczął pracę nad następnym standardem C++23 (C++2b) i na najbliższym wirtualnym posiedzeniu rozważy możliwe nowości.

Podstawowe cechy C++20 (przykłady kodu):

  • Dodano „koncepty”, rozszerzenia szablonów, które pozwalają określić zestaw wymagań dla parametrów szablonów, ograniczających zestaw argumentów, które mogą być przyjmowane jako parametry szablonów podczas kompilacji. Koncepty można stosować, aby uniknąć logicznych niespójności między właściwościami typów danych używanych w szablonie a właściwościami typów danych parametrów wejściowych.

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

  • W skład przyjętych dla JavaScript, takie jak typy BigInt i BigFloat, a także zostały moduły, które można stosować zamiast plików nagłówkowych. Moduły oferują nowy sposób organizacji kodu źródłowego na podstawie definicji granic komponentów, bez korzystania z dołączanych plików nagłówkowych z „#include”.
  • Makro __VA_OPT__ do adaptacyjnego rozwijania wariacyjnych makr w zależności od obecności tokenów w argumentach wariacyjnych.
  • Wsparcie dla operatora „” dla trójstronnego porównania.
  • Wsparcie dla inicjalizatorów elementów domyślnych dla pól bitowych.
  • Możliwość wychwytywania wyrażeń „*this” w lambda.

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

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

  • Wywoływanie elementów przez wskaźnik (Pointer-to-member), używając określonych poprzez wyrażenie „const &” wskaźników do obiektów tymczasowych.
  • Operator delete z destruktorem opisanym w dokumencie P0722R1.
  • Klasom zezwala się na użycie parametrów szablonu bez typu.

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // używa domyślnego konstruktora
    get_foo();

  • Niezapisywane wyrażenia lambda z konstruktorem.
  • Zezwalanie na użycie składni szablonów dla wyrażeń lambda („auto f = [](std::vector v)”).
  • Możliwość użycia literałów stringowych w parametrach szablonu.
  • Wsparcie dla składni inicjalizacji w stylu C — jawnie nie wymienione w liście inicjalizacji pola inicjalizowane są domyślnie.

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

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

  • Wsparcie dla pustych członów struktur danych.
  • Wsparcie dla atrybutów likely i unlikely w celu informowania optymalizatora o prawdopodobieństwie spełnienia warunku („[[likely]] if (random > 0) {”).
  • Możliwość użycia zakresów do inicjalizacji wartości zmiennej w pętli „for”

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

  • Automatyczne obliczanie rozmiaru tablicy w new („new double[]{1,2,3}”);
  • Atrybut „[[no_unique_address]]”, dzięki któremu zmienne bez danych nie zajmują miejsca.
  • Atomowe wskaźniki (std::atomic<shared_ptr> i std::atomic<weak_ptr>).
  • Możliwość wywoływania funkcji wirtualnych w wyrażeniach warunkowych.
  • Wsparcie dla szybkich (immediate) funkcji, które mogą działać tylko z stałymi.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // BŁĄD: 'x' nie może być używany jako stała

  • Możliwość stosowania constexpr z funkcjami wirtualnymi („constexpr virtual int f() const { return 2; }”).
  • W standardowej bibliotece:
    • Dodano wsparcie dla typu char8_t dla ciągów UTF-8.
    • Dodano pliki nagłówkowe bit (operacje bitowe) i version.
    • Pojawiła się możliwość sprawdzania prefiksów i sufiksów ciągów (starts_with, ends_with).
    • Dodano typy std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity.
    • Dodano funkcje std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated i std::assume_aligned.
    • W std::make_shared dodano wsparcie dla tablic.
    • Dodano funkcję std::to_array do konwertowania obiektów podobnych do tablic na std::array.
  • Bardziej wygodna składnia dla enumeracji:

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

  • W indeksach z powodu nieokreślonego zachowania zabronione jest użycie operacji „,” („a[b,c]”). Wsparcie dla większości operacji z zmiennymi zadeklarowanymi z kluczowym słowem volatile zostało zakończone, w tym zabronione są operacje „++” oraz „—” dla standardowych typów.
  • Liczba sytuacji wymagających podania „typename” w celu informowania o istnieniu typu została ograniczona.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster