Membekukan fitur C ++ 20. Coroutine, Modul dan banyak lagi

Suatu hari ada pertemuan komite standardisasi internasional C ++ di kota Amerika Kona. Itu bukan hanya pertemuan, tetapi pembekuan fitur! Tidak ada ide baru yang serius yang dapat meresap ke dalam standar lagi, hanya ada beberapa pertemuan yang tersisa untuk menambahkan hal-hal yang telah disetujui sebelumnya, memperbaiki kekurangan dan menghilangkan kekasaran.

Jika Modul dan Corutin diharapkan dalam C ++ 20, apakah akan ada pustaka cepat untuk memformat output, apakah akan dapat bekerja dengan kalender, akankah mereka menambahkan std :: stacktrace , akankah kompiler mulai memanggil std :: memindahkan sendiri dalam beberapa kasus, apakah mereka akan menerima std :: flat_map ? Semua ini dan banyak lagi menanti Anda di bawah luka.



Coroutines TS


Debat terpanas muncul di sekitar coroutine. Komite harus mempertimbangkan tiga pendekatan berbeda untuk coroutine dan memutuskan apakah akan menerima Coroutines TS yang ada sebagai standar, atau mengambil jalan yang berbeda.

Pilihannya tidak mudah, setiap pendekatan memiliki kekurangan dan kelebihan:

  • N4775 :
    • + tidak ada batasan pada fakta bahwa coroutine harus dijelaskan dalam file header
    • - tidak ada jaminan ketat bahwa tidak akan ada alokasi dinamis
    • ± bukan antarmuka yang termudah ( P1477R0 memperbaiki ini)
    • - kata kunci jelek co_await dan co_yield (kalimat P1485R0 dari WP21 memperbaiki ini)
    • + 3 tahun diterapkan dalam praktik

  • P1063R2 :
    • + tidak ada alokasi dinamis
    • - coroutine harus dijelaskan dalam file header atau Anda perlu menipu diri sendiri dengan mengetikkan diri Anda sendiri
    • - operator kunci yang lebih menakutkan [<-] dan [->]
    • - tidak ada prototipe yang berfungsi
    • - bukan antarmuka termudah untuk membuat hal-hal yang tidak sinkron

  • P1430R0 :
    • + tidak ada alokasi dinamis
    • - coroutine harus dijelaskan dalam file header atau Anda harus keluar sendiri dengan licik
    • + tidak ada kata kunci yang menakutkan, semuanya lancar
    • + Pengguna Corutin tidak melihat bagian dalam coroutine yang menakutkan (bahkan tidak melihat analog co_await, semuanya bekerja di luar kotak)
    • - proposal pertama, belum pernah dibahas, membutuhkan banyak perbaikan
    • - tidak mungkin untuk menerapkan teknologi saat ini (memerlukan dukungan untuk struktur berukuran dinamis), membutuhkan biaya tenaga kerja yang besar untuk diimplementasikan
    • ± agak mirip mie panggilan balik


Setelah banyak perdebatan, coroutine diadopsi dalam C ++ 20 karena mereka di Coroutines TS (dengan awalan co_ * dan poin kustomisasi lama).

Modul


Diskusi modul dipengaruhi oleh satu dokumen yang menarik dengan pengukuran kinerja:
P1441R0 . Hasilnya dapat diinterpretasikan dengan cara yang berbeda: dari "sistem perakitan yang ada dan implementasi modul belum cukup dioptimalkan" hingga "modul tidak skala dengan baik dengan meningkatnya kompleksitas proyek."

Selain dokumen ini, panitia membahas sejumlah perubahan kecil pada modul saat ini. Hasilnya, setelah 15 tahun berdiskusi, membuat prototipe, dan bereksperimen dengan implementasi, modul-modul tersebut diadopsi dalam C ++ 20.

Format


Berita baik semuanya! Jika Anda tidak menemukan cacat fatal dalam subkelompok Perpustakaan, maka dalam C ++ 20 akan mungkin untuk memformat string dengan aman dan sangat cepat. Ucapkan selamat tinggal pada std :: ios , std :: locale dan kengerian lainnya di tahun 90an! Python sekarang memiliki sintaksis yang sama untuk memformat di luar kotak di C ++: P0645R5 .

Selain itu, proposal untuk mengintegrasikan pemformatan dan waktu kalender baru P1361R0 diterima . Jika semuanya berjalan sesuai rencana, maka tanggal dapat ditampilkan dengan cara manusia!

Jaringan, Pelaksana, dan Properti


Pelaksana adalah batu bata penting untuk mendukung Jaringan di C ++ di luar kotak. Pelaksana membutuhkan Properti - kemampuan untuk memodifikasi tipe data, tergantung pada parameter yang dikirimkan pada tahap kompilasi, tanpa mengubah konsep tipe.

Properti dijelaskan dalam P1393R0 . Terlepas dari kenyataan bahwa teks untuk dimasukkan dalam standar hanya beberapa halaman, proposal tersebut menyebabkan diskusi panas. Proposal memungkinkan Anda untuk membuat poin kustomisasi yang hampir mahakuasa, mengubah perilaku fungsi apa pun menggunakan Properti.

Akibatnya, diputuskan untuk memasukkan Properti dalam bahasa hanya dalam C ++ 23, dan karenanya, Pelaksana dan Jaringan di C ++ 20 tidak akan muncul.

Lainnya


Perubahan berikut telah dibuat pada konsep C ++ 20:

  • Struktur tanpa konstruktor (agregat) sekarang dapat diinisialisasi menggunakan tanda kurung P0960 . Dalam prakteknya, ini berarti sekarang std :: make_share , std :: make_unique , std :: * :: emplace * akan bekerja dengan benar dengan agregat tanpa kesalahan kompilasi
  • Fungsi Lerp untuk interpolasi linier P0811 telah ditambahkan
  • Menambahkan kemampuan untuk memvariasikan algoritma perpustakaan standar P1001
  • Metode std :: span sekarang mengembalikan tipe yang tidak ditandatangani (mirip dengan seluruh perpustakaan standar) + fungsi std :: ssize ditambahkan untuk mendapatkan ukuran wadah sebagai nomor yang ditandatangani P1227
  • Kontainer yang tidak berurutan belajar cara mencari nilai menggunakan hash P0920 yang telah dihitung sebelumnya

Banyak hal lain menunggu tinjauan akhir dalam subkelompok Library dan Core untuk dimasukkan dalam C ++ 20:

  • Efektif menunggu di std :: atomic; kelas semafor dan penghalang P1135
  • std :: flat_map P0429
  • std :: flat_set P1222
  • std :: function_ref P0792
  • constexpr untuk <cmath> dan <cstdlib> P0533
  • std :: rentang :: ke <any-container> untuk menyimpan rentang nilai dalam wadah P1206
  • Kemampuan untuk mengekstraksi string secara efisien dari std :: * stringstream dan mentransfer string kustom P0408
  • Beberapa suntingan untuk operator <=> , rentang, constexpr

Kelebihan RG21


Pada hari pertama, subkelompok Core mengambil proposal Yandex.Taxi tercinta untuk Stacktrace P0881R3 . Komentar desain dibahas lebih lanjut dalam subkelompok LEWG, sekali lagi bekerja di Core. Akibatnya, koreksi dilakukan sepanjang minggu dan diskusi diadakan. Proposal belum dimasukkan dalam standar rancangan, tetapi harus dalam C ++ 20 (jika mereka tiba-tiba menemukan beberapa kesalahan fatal).

Sebelum membahas ide kami tentang P1485R0 untuk membawa kata kunci untuk coroutine, itu tidak sampai pada kesimpulan.

Juga di SG1, Concurrency mendiskusikan ide peta P0652R2 yang tidak berurutan . Kami diminta untuk memeriksa ulang apakah API yang diusulkan menghindari pertentangan pembaca. Mereka juga mengatakan untuk menyelidiki wadah tidak berurutan yang bersamaan yang tidak memiliki fungsi hapus dan tidak melindungi nilai wadah dari modifikasi kompetitif.

Tawaran dari ZaMaZaN4iK untuk mengkhususkan std :: hash untuk berbagai kelas dari perpustakaan standar P1406R0 diputuskan untuk dipotong dengan keras. Komite merekomendasikan meninggalkan spesialisasi hanya untuk std :: pair , std :: tuple , std :: array dan std :: basic_string dari pengalokasi pengguna.

Dalam subset angka, SG6 membahas mekanisme interaksi berbagai kelas baru nomor P0880R2 . Proposal ini memungkinkan Anda untuk mengkhususkan dua templat, mendapatkan rangkaian lengkap operasi matematika dan perbandingan untuk semua jenis baru. Setelah diskusi, mereka memutuskan untuk mencoba memperluas mekanisme sehingga dapat digunakan tidak hanya untuk kebutuhan perpustakaan standar, tetapi juga pengguna dapat menggunakan operator ini untuk tipe mereka.

Kami juga membahas saran kecil kami, termasuk pengujian fitur makro P1424R0 dan kebijakan untuk menambahkannya ke standar.

Kami dengan cepat mendiskusikan ide kami untuk memungkinkan kompiler menghapus salinan R0889R1 yang tidak perlu. Kami disuruh terus bekerja ke arah ini dan memberikan contoh yang tidak boleh melanggar aturan baru.

Alih-alih total


C ++ 20 akan secara dramatis berbeda dari C ++ 17 seperti C ++ 11 akan berbeda dari C ++ 03. Sejumlah besar teknologi baru dan paradigma baru: Konsep, Kontrak, Rentang, Modul, Coroutine, wadah constexpr dan constimpr dynamic polymorphism, "nibloids", dll.

Segera kami, Kelompok Kerja 21, akan memposting komentar tentang draft standar C ++ 20. Karena itu, jika Anda merasa sakit atau Anda tidak setuju dengan inovasi apa pun, silakan tinggalkan pikiran Anda di halaman ini .

Pertemuan komite internasional berikutnya akan diadakan pada musim panas, di mana inovasi untuk C ++ 23 dapat mulai dipertimbangkan. Jika Anda ingin mengubah sesuatu dalam C ++ atau mengusulkan ide Anda, Anda selalu dapat menulis di https://stdcpp.ru/ , di mana orang-orang dari WP21 akan membantu Anda menyampaikan keinginan Anda kepada komite.

Apakah Anda ingin berbicara dengan kami secara langsung? Pertemuan terbuka RG21 akan segera diadakan, tetap ikuti pengumuman di events.yandex.ru . Lihat juga kami di konferensi C ++ Rusia April di Moskow.

Source: https://habr.com/ru/post/id438864/


All Articles