Komite ISO menyetujui standar "C ++ 20"





Baru-baru ini, Komite ISO untuk Standardisasi Bahasa C ++ (ya, ada satu) menyetujui standar internasional "C ++ 20". Fitur yang disajikan dalam spesifikasi didukung oleh kompiler GCC, Clang, dan Microsoft Visual C ++. Selain itu, pustaka standar dengan dukungan untuk "C ++ 20" diimplementasikan dalam proyek Boost.



Langkah selanjutnya adalah menyiapkan dokumen untuk dipublikasikan. Kemudian, pada awal November, versi final akan dikirim ke ISO, setelah itu diterbitkan dengan nama resmi ISO / IEC 14882: 2020. Panitia sedang mengerjakan standar berikutnya, C ++ 23 (C ++ 2b). Di bawah potongan - fitur "C ++ 20" dengan contoh kode.



Apa yang baru?



Panitia menambahkan "konsep" , ekstensi template yang memungkinkan Anda menentukan sekumpulan persyaratan untuk parameter template. Pada waktu kompilasi, mereka membatasi set argumen yang dapat diterima sebagai parameter template. Konsep tersebut memungkinkan untuk menghindari ketidakkonsistenan logis antara properti tipe data yang digunakan dalam template dan properti tipe data dari parameter input.



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


Ekstensi diterima untuk bekerja dengan modul. Mereka dapat digunakan sebagai pengganti file header. Modul menyediakan cara baru untuk mengatur sumber berdasarkan definisi batas komponen, tanpa menyertakan file header menggunakan "#include".



Menambahkan makro __VA_OPT__ untuk perluasan adaptif makro variadic bergantung pada keberadaan token dalam argumen variadic.



Menambahkan dukungan untuk operator <=> untuk perbandingan tiga arah. Penginisialisasi elemen default untuk bidang bit



didukung .



Menambahkan kemampuan untuk menangkap ekspresi lambda * this.



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


Kelas sekarang dapat menggunakan parameter template tanpa tipe.



   struct foo {
     foo() = default;
     constexpr foo(int) {}
   };
 
   template <foo f>
   auto get_foo() {
     return f; 
   }
 
   get_foo(); // uses implicit constructor
   get_foo<foo{123}>();


Sekarang Anda dapat menggunakan literal string dalam parameter template. Mendukung sintaks inisialisasi gaya-C. Mereka yang tidak secara eksplisit tercantum dalam daftar inisialisasi bidang diinisialisasi secara default.



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


Anggota kosong dari struktur data didukung.



Atribut kemungkinan dan tidak mungkin didukung untuk menginformasikan pengoptimal tentang kemungkinan pernyataan bersyarat dipicu ("[[kemungkinan]] jika (acak> 0) {").



Sekarang Anda dapat menggunakan rentang untuk menginisialisasi nilai variabel dalam perulangan for



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


Fungsi langsung didukung , yang hanya dapat bekerja dengan konstanta.



 consteval int sqr(int n) {
     return n * n;
   }
 
   constexpr int r = sqr(100); // OK
   int x = 100;
   int r2 = sqr(x); // ERROR:  'x'     


Ditambahkan ke perpustakaan:

  • dukungan untuk tipe char8_t untuk string UTF-8.
  • bit header (operasi bit) dan versi.
  • kemampuan untuk memeriksa awalan dan akhiran string (begin_with, end_with).
  • sifat std :: remove_cvref, std :: unwrap_reference, std :: unwrap_decay_ref, std :: is_nothrow_convertible, dan std :: type_identity.
  • fungsi std :: midpoint, std :: lerp, std :: bind_front, std :: source_location, std :: visit, std :: is_constant_evaluated, dan std :: asss_aligned.
  • dukungan untuk array di std :: make_shared.
  • std :: to_array berfungsi untuk mengubah objek mirip array menjadi std :: array.


Sintaks enumerasi sekarang lebih nyaman:

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


Dilarang menggunakan operasi "," ("a [b, c]") dalam indeks . Sebagian besar operasi pada variabel yang dideklarasikan dengan kata kunci yang melanggar, termasuk operasi yang dilarang ++ dan - pada tipe standar, tidak didukung.






All Articles