Piawaian C++20 diluluskan

Jawatankuasa ISO mengenai Penyeragaman Bahasa C++ diluluskan piawaian antarabangsa "C ++ 20". Keupayaan yang dibentangkan dalam spesifikasi, kecuali kes terpencil, disokong dalam penyusun GCC, Dakap ΠΈ Microsoft Visual C ++. Perpustakaan standard yang menyokong C++20 dilaksanakan dalam projek Tingkatkan.

Dalam dua bulan akan datang, spesifikasi yang diluluskan akan berada di peringkat penyediaan dokumen untuk penerbitan, di mana kerja akan dijalankan pada pembetulan editorial kesilapan ejaan dan kesilapan menaip. Pada awal November, dokumen yang terhasil akan dihantar ke ISO untuk diterbitkan di bawah nama rasmi ISO/IEC 14882:2020. Sementara itu, jawatankuasa itu telah pun memulakan kerja pada piawaian C++23 seterusnya (C++2b) dan akan mempertimbangkan pilihan yang mungkin pada mesyuarat maya seterusnya. inovasi.

Utama ciri- C ++ 20 (contoh kod):

  • Menambahkan "konsep", sambungan templat, yang membolehkan anda mentakrifkan satu set keperluan parameter templat yang, pada masa penyusunan, mengehadkan set hujah yang boleh diterima sebagai parameter templat. Konsep boleh digunakan untuk mengelakkan ketidakkonsistenan logik antara sifat jenis data yang digunakan dalam templat dan sifat jenis data parameter input.

    templat
    konsep EqualityComparable = memerlukan(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Diterima pengembangan untuk bekerja dengan modul yang boleh digunakan dan bukannya fail pengepala. Modul menyediakan cara baharu untuk menyusun kod sumber berdasarkan penentuan sempadan komponen, tanpa memasukkan fail pengepala melalui "#include".
  • Makro __VA_OPT__ untuk pengembangan penyesuaian makro pembolehubah bergantung pada kehadiran token dalam argumen pembolehubah.
  • Sokongan untuk pengendali "" untuk perbandingan tiga hala.
  • Sokongan untuk pemula elemen lalai untuk medan bit.
  • Keupayaan untuk lambda menangkap ungkapan "*ini".

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

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

  • Memanggil elemen dengan penunjuk (Penunjuk kepada ahli), menggunakan penunjuk kepada objek sementara yang ditakrifkan melalui ungkapan "const &".
  • Pengendali padam dengan pemusnah yang diterangkan dalam dokumen P0722R1.
  • Kelas dibenarkan menggunakan parameter templat tanpa jenis.

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

    templat
    auto get_foo() {
    pulangan f;
    }

    get_foo(); // menggunakan pembina tersirat
    get_foo ();

  • Ungkapan lambda tidak berterusan dengan pembina.
  • Membenarkan sintaks templat untuk ungkapan lambda (β€œauto f = [] (std::vektor v)").
  • Keupayaan untuk menggunakan literal rentetan dalam parameter templat.
  • Sokongan untuk sintaks permulaan gaya C - medan yang tidak disenaraikan secara eksplisit dalam senarai permulaan dimulakan secara lalai.

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

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

  • Sokongan untuk ahli struktur data kosong.
  • Sokongan untuk atribut berkemungkinan dan tidak berkemungkinan untuk memaklumkan pengoptimum tentang kebarangkalian binaan bersyarat dicetuskan (β€œ[[kemungkinan]] jika (rawak > 0) {β€œ).
  • Keupayaan untuk menggunakan julat untuk memulakan nilai pembolehubah dalam gelung "untuk".

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

  • Pengiraan automatik saiz tatasusunan dalam baharu (β€œberganda baharu[]{1,2,3}”);
  • Atribut β€œ[[no_unique_address]]” di mana pembolehubah tanpa data tidak mengambil ruang.
  • Penunjuk atom (std::atomic > dan std::atomic >).
  • Keupayaan untuk memanggil fungsi maya dalam ungkapan bersyarat.
  • Sokongan untuk fungsi segera yang hanya boleh berfungsi dengan pemalar.

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

    constexpr int r = sqr(100); // OKEY
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' tidak boleh digunakan sebagai pemalar

  • Keupayaan untuk menggunakan constexpr dengan fungsi maya (β€œconstexpr virtual int f() const { return 2; }”).
  • Dalam perpustakaan standard:
    • Menambah sokongan untuk jenis char8_t untuk rentetan UTF-8.
    • Menambahkan fail pengepala bit (operasi bit) dan versi.
    • Ia kini boleh menyemak awalan dan akhiran rentetan (bermula_dengan, berakhir_dengan).
    • Menambahkan std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible dan std::type_identity traits.
    • Menambah fungsi std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated dan std::assume_aligned.
    • Menambah sokongan untuk tatasusunan ke std::make_shared.
    • Menambahkan fungsi std::to_array untuk menukar objek seperti tatasusunan kepada std::array.
  • Sintaks penghitungan yang lebih mudah:

    kelas enum rgba_color_channel { merah, hijau, biru, alfa };

    std::string_view to_string(rgba_color_channel my_channel) {
    suis (saluran_saya) {
    menggunakan enum rgba_color_channel;
    kes merah: kembalikan "merah";
    kes hijau: kembalikan "hijau";
    kes biru: kembalikan "biru";
    kes alpha: kembalikan "alpha";
    }
    }

  • Dalam indeks, disebabkan oleh tingkah laku yang tidak ditentukan, penggunaan operasi β€œ,” (β€œa[b,c]”) adalah dilarang. Sokongan untuk kebanyakan operasi dengan pembolehubah yang diisytiharkan dengan kata kunci yang tidak menentu telah dihentikan, termasuk operasi "++" dan "β€”" dengan jenis standard.
  • Mengurangkan bilangan situasi di mana "nama taip" diperlukan untuk menunjukkan kehadiran jenis.

Sumber: opennet.ru

Tambah komen