C++20 standartı təsdiq edilib

C++ dilinin standartlaşdırılması üzrə ISO komitəsi təsdiqlədi beynəlxalq standart «C++20«. Specifikasiyada təqdim olunan imkanlar, tək-tək hallar istisna olmaqla, lükdarıp tərtibedici sistemlərdə GCC, ClangMicrosoft Visual C++. C++20 standartına uyğun standart kitabxanaları Boost.

Gələcək iki ay ərzində təsdiq olunan spesifikasiya nəşr üçün sənədin hazırlanması mərhələsində olacaq, burada yazı səhvləri və tipoqrafik səhvlər üzərində redaktə işi aparılacaq. Noyabrın əvvəlində sənədin nəticə variantı ISO-ya təqdim ediləcək, rəsmi adı ISO/IEC 14882:2020 ilə nəşr olunması üçün. Bu arada, komitə artıq gələcək C++23 (C++2b) standartı üzərində işləməyə başlayıb və yaxın virtual görüşdə mümkün yeni xüsusiyyətlər.

Əsas xüsusiyyətlər C++20 (kod nümunələri):

  • «konsepsiyalar» əlavə edilmişdir, şablonlara parametrlərə olan tələblər toplusunu müəyyən etməyə imkan verən genişləndirmələr, bu zaman tərtibat zamanı şablon parametrləri kimi qəbul edilə biləcək arqumentlər dəsti məhdudlaşdırılır. Konsepsiyalar, şablon daxilində istifadə olunan verilənlərin tip xüsusiyyətləri ilə giriş parametrlərinin tip xüsusiyyətləri arasında məntiqi uyğunsuzluqları qarşısını almaq üçün tətbiq oluna bilər.

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

  • Məqsədli modullar üçün qəbul edildi ki, bunlar başlıq faylları əvəzinə istifadə oluna bilsin. Modullar, qoşulan «#include» başlıqları olmadan komponentlərin sərhədini müəyyən etmək əsasında mənbə kodlarını təşkil etmək üçün yeni bir yol təqdim edir. uzantılar __VA_OPT__ makrosu, dəyişkən makroların genişləndirilməsini dəyişkən arqumentdəki tokenlərin mövcudluğuna görə uyğundur.
  • Üç tərəfli müqayisə üçün «» operatorunun dəstəyi.
  • Bit sahələri üçün əvvəlcədən müəyyən edilmiş elementlərin inişalizatorlarının dəstəyi.
  • «*this» ifadələrinin lambda tutma imkanları.
  • struct int_value {

    int n = 0;
    auto getter_fn() {
    return [=, *this]() { return n; };
    // BAD:
    // return [=]() { return n; };

    // GOOD:
    Göstəricilər (Pointer-to-member) ilə üzv çağırışı, «const &» ifadəsi ilə müəyyən edilmiş müvəqqəti obyektlərdən istifadə etməklə.
    }
    };

  • Sənəddə təsvir edilmiş delete operatoru
  • P0722R1 Siniflərə tip parametrlərindən istifadə edilməsinə icazə verilir..
  • struct foo {

    foo() = default;
    constexpr foo(int) {}
    template <foo f>
    };

    auto get_foo() {
    return f;
    get_foo(); \/\/ implicit constructor istifadə edir
    }

    get_foo<foo{123}>();
    Saxlanmayan lambda ifadələri ilə konstruktorlar.

  • Lambda ifadələri üçün şablon sintaksisinin istifadəsi üçün icazə (»auto f = []<typename T>(std::vector<T> v)«) verilir.
  • Şablon parametrlərində mətn literallarının istifadəsi imkanları.
  • C stilində başlanğıc sintaksisinin dəstəyi — açıq şəkildə qeyd edilməmiş listdəki sahələr, avtomatik olaraq başlanğıc dəyərləri ilə başlanır.
  • struct A {

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

    Boş məlumat strukturlarının üzv dəstəyi.

  • Поддержка пустых членов структур данных.
  • likely və unlikely atributlarının şərti ifadənin tetiklənmə ehtimalını optimizatora bildirmək üçün dəstəklənməsi ("[[likely]] if (random > 0) {").
  • for dövründə dəyişən dəyərlərini başlatmaq üçün diapazonlardan istifadə imkanını.

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

  • new-də massiv ölçüsünün avtomatik hesablanması ("new double[]{1,2,3}");
  • "[[no_unique_address]]" atributu, burada məlumatı olmayan dəyişənlər yer tutmur.
  • Atomik göstəricilər (std::atomic<shared_ptr> və std::atomic<weak_ptr>).
  • Şərti ifadələrdə virtual funksiyaların çağırılması imkanını.
  • Yalnız sabitlərlə işləyə bilən tez (immediate) funksiyaların dəstəklənməsi.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // Xətalı: 'x' sabit kimi istifadə oluna bilməz

  • virtual funksiyalarla constexpr-in istifadəsi imkanının olması ("constexpr virtual int f() const { return 2; }").
  • Standart kitabxanada:
    • UTF-8 üçün char8_t tipinin dəstəklənməsi əlavə edilmişdir.
    • bit (bit əməliyyatları) və version başlıq faylları əlavə edilmişdir.
    • String-lərin prefiksini və s suffiksini yoxlamaq imkanı (starts_with, ends_with) əlavə edilmişdir.
    • std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible və std::type_identity tip formalaşdırıcıları əlavə edilmişdir.
    • std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated və std::assume_aligned funksiyaları əlavə edilmişdir.
    • std::make_shared-də massivlərin dəstəklənməsi əlavə edilmişdir.
    • Massivə bənzər obyektləri std::array-ə çevirmək üçün std::to_array funksiyası əlavə edilmişdir.
  • Daha əlverişli enumerasiyaların sintaksisi:

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

  • İndeksdə qeyri-müəyyən davranış səbəbindən "," əməliyyatının istifadəsi qadağan edilmişdir ("a[b,c]") . volatile açar sözü ilə elan edilmiş dəyişənlərlə əksəriyyət əməliyyatlarının dəstəyi dayandırılıb, daxil olmaqla standart tiplərlə "++" və "--" əməliyyatları qadağan olunmuşdur.
  • typename-dan faydalanmağı tələb edən vəziyyətlərin sayı azaldılıb.

Mənbə: opennet.ru

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster