C++20 standartı təsdiq edilmişdir

ISO C++ Dilinin Standartlaşdırma Komitəsi təsdiqləndi beynəlxalq standart”C ++ 20". Ayrı-ayrı hallar istisna olmaqla, spesifikasiyada təqdim olunan imkanlar, dəstəklənir kompilyatorlarda GCC, Cingildəmək и Microsoft Visual C ++. Layihə çərçivəsində C++20-ni dəstəkləyən standart kitabxanalar həyata keçirilir Kömək.

Növbəti iki ayda təsdiq edilmiş spesifikasiya sənədin çapa hazırlanması mərhələsində olacaq, bu mərhələdə orfoqrafiya və yazı xətalarının redaksiya korreksiyası aparılacaq. Noyabrın əvvəlində əldə edilən sənəd ISO/IEC 14882:2020 rəsmi adı altında dərc olunmaq üçün İSO-ya göndəriləcək. Bu arada komitə artıq növbəti C++23 standartı (C++2b) üzərində işə başlayıb və növbəti virtual iclasında mümkün variantları nəzərdən keçirəcək. yeniliklər.

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

  • Kompilyasiya zamanı şablon parametrləri kimi qəbul edilə bilən arqumentlər toplusunu məhdudlaşdıran şablon parametr tələbləri toplusunu müəyyən etməyə imkan verən "konseptlər", şablon uzantıları əlavə edildi. Şablonda istifadə olunan məlumat növlərinin xüsusiyyətləri ilə giriş parametrlərinin məlumat tipi xüsusiyyətləri arasında məntiqi uyğunsuzluqların qarşısını almaq üçün anlayışlar istifadə edilə bilər.

    şablon
    konsepsiyası BərabərlikMüqayisəli = tələb edir(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Qəbul edildi genişlənməsi başlıq faylları əvəzinə istifadə edilə bilən modullarla işləmək üçün. Modullar “#include” vasitəsilə başlıq faylları daxil etmədən komponentlərin sərhədlərini müəyyən etməyə əsaslanan mənbə kodunu təşkil etmək üçün yeni üsul təqdim edir.
  • Makro __VA_OPT__ dəyişən arqumentində işarələrin mövcudluğundan asılı olaraq dəyişən makroların adaptiv genişləndirilməsi üçün.
  • Üçtərəfli müqayisə üçün "" operatoruna dəstək.
  • Bitfields üçün standart element başlatıcıları üçün dəstək.
  • Lambda "*this" ifadələrini tutmaq bacarığı.

    struct int_value {
    int n = 0;
    auto getter_fn() {
    //PİS:
    // qayıt [=]() { qaytar n; };

    // YAXŞI:
    qaytarın [=, *bu]() { qaytarın n; };
    }
    };

  • “const &” ifadəsi ilə müəyyən edilmiş müvəqqəti obyektlərə göstəricilərdən istifadə etməklə elementləri göstərici ilə çağırmaq (Göstəricidən üzvə).
  • Sənəddə təsvir edilən dağıdıcı ilə sil operatoru P0722R1.
  • Siniflərə tipsiz şablon parametrlərindən istifadə etməyə icazə verilir.

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

    şablon
    auto get_foo() {
    qayıt f;
    }

    get_foo(); // gizli konstruktordan istifadə edir
    get_foo ();

  • Konstruktor ilə qeyri-davamlı lambda ifadələri.
  • Lambda ifadələri üçün şablon sintaksisinə icazə verilir (“avtomatik f = [] (std::vektor v)").
  • Şablon parametrlərində sətir literallarından istifadə etmək bacarığı.
  • C-stil başlanğıc sintaksisi üçün dəstək - başlatma siyahısında açıq şəkildə qeyd olunmayan sahələr defolt olaraq işə salınır.

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

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

  • Boş məlumat strukturu üzvlərinə dəstək.
  • Şərti konstruksiyanın işə salınma ehtimalı haqqında optimallaşdırıcıya məlumat vermək üçün ehtimal olunan və mümkün olmayan atributlara dəstək (“[[ehtimal]] əgər (təsadüfi > 0) {“).
  • Dəyişən dəyərləri "for" döngəsində başlatmaq üçün diapazonlardan istifadə etmək bacarığı

    üçün (avtomatik v = std::vektor{1, 2, 3}; auto& e : v) {

  • Yenidə massiv ölçüsünün avtomatik hesablanması (“yeni ikiqat[]{1,2,3}”);
  • Məlumatsız dəyişənlərin yer tutmadığı “[[unique_address]]” atributu.
  • Atom göstəriciləri (std::atomic > və std::atomic >).
  • Şərti ifadələrdə virtual funksiyaları çağırmaq bacarığı.
  • Yalnız sabitlərlə işləyə bilən ani funksiyalar üçün dəstək.

    consteval int sqr(int n) {
    n * n qaytarın;
    }

    constexpr int r = sqr(100); // TAMAM
    int x = 100;
    int r2 = sqr(x); // XƏTA: 'x' sabit kimi istifadə edilə bilməz

  • constexpr-dən virtual funksiyalarla istifadə etmək imkanı (“constexpr virtual int f() const { return 2; }”).
  • Standart kitabxanada:
    • UTF-8 sətirləri üçün char8_t növü üçün əlavə dəstək.
    • Başlıq faylları biti (bit əməliyyatları) və versiya əlavə edildi.
    • İndi sətirlərin prefiksini və şəkilçisini yoxlamaq mümkündür (başlanğıc_ilə, bitir_ilə).
    • std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible və std::type_identity xüsusiyyətləri əlavə edildi.
    • Əlavə edilmiş funksiyalar std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated və std::assume_aligned.
    • std::make_shared-ə massivlər üçün dəstək əlavə edildi.
    • Massiv kimi obyektləri std::array-a çevirmək üçün std::to_array funksiyası əlavə edildi.
  • Daha rahat sayma sintaksisi:

    enum sinfi rgba_color_channel {qırmızı, yaşıl, mavi, alfa};

    std::string_view to_string(rgba_color_channel my_channel) {
    keçid (kanalım) {
    enum rgba_color_channel istifadə edərək;
    qırmızı halda: "qırmızı" qaytarın;
    yaşıl vəziyyət: "yaşıl" qaytarın;
    halda mavi: "mavi" qaytarın;
    case alpha: "alfa" qaytarın;
    }
    }

  • İndekslərdə qeyri-müəyyən davranışa görə “,” (“a[b,c]”) əməliyyatının istifadəsi qadağandır. Standart növlərlə “++” və “—” əməliyyatları da daxil olmaqla, dəyişkən açar sözü ilə elan edilmiş dəyişənlərlə əməliyyatların əksəriyyəti üçün dəstək dayandırılıb.
  • Bir növün mövcudluğunu göstərmək üçün "tip adı" tələb olunan vəziyyətlərin sayı azaldıldı.

Mənbə: opennet.ru

Добавить комментарий