Belum lama ini membutuhkan-ekspresi (frase yang diperkenalkan oleh yang kedua membutuhkan) tidak diperbolehkan dalam ekspresi-kendala (frase yang diperkenalkan oleh yang pertama membutuhkan). Itu hanya bisa muncul dalam definisi konsep. Bahkan, inilah yang diusulkan di bagian makalah itu di mana klaim itu muncul.
Namun, pada 2016, ada proposal untuk melonggarkan pembatasan itu [Catatan Editor: P0266 ]. Perhatikan coretan paragraf 4 di bagian 4 makalah ini. Dan dengan demikian lahir membutuhkan membutuhkan.
Sejujurnya, saya tidak pernah benar-benar menerapkan pembatasan itu di GCC, jadi itu selalu mungkin. Saya pikir Walter mungkin telah menemukannya dan bermanfaat, mengarah ke kertas itu.
Agar siapa pun berpikir bahwa saya tidak sensitif terhadap penulisan memerlukan dua kali, saya memang meluangkan waktu mencoba untuk menentukan apakah itu dapat disederhanakan. Jawaban singkat: tidak.
Masalahnya adalah bahwa ada dua konstruksi gramatikal yang perlu diperkenalkan setelah daftar parameter templat: sangat umum ekspresi kendala (seperti P && Q
) dan kadang-kadang persyaratan sintaksis (seperti requires (T a) { ... }
). Itu disebut membutuhkan-ekspresi.
Yang pertama membutuhkan memperkenalkan kendala. Yang kedua membutuhkan pengenalan yang membutuhkan-ekspresi. Itulah cara tata bahasa menyusun. Saya tidak menganggapnya membingungkan sama sekali.
Saya mencoba, pada satu titik, untuk menciutkan ini ke satu kebutuhan. Sayangnya, itu mengarah pada beberapa masalah penguraian yang sangat sulit. Anda tidak dapat dengan mudah memberi tahu, misalnya jika suatu (
keharusan setelah menunjukkan subekspresi bersarang atau daftar parameter. Saya tidak percaya bahwa ada disambiguasi sempurna dari sintaks tersebut (lihat alasan untuk sintaks inisialisasi seragam; masalah ini ada di sana juga).
Jadi Anda membuat pilihan: make mengharuskan memperkenalkan ekspresi (seperti sekarang) atau membuatnya memperkenalkan daftar persyaratan parameter.
Saya memilih pendekatan saat ini karena sebagian besar waktu (seperti dalam hampir 100% dari waktu), saya menginginkan sesuatu selain ekspresi yang membutuhkan. Dan dalam kasus yang sangat langka saya memang menginginkan ekspresi yang membutuhkan kendala ad hoc, saya benar-benar tidak keberatan menulis kata itu dua kali. Ini adalah indikator yang jelas bahwa saya belum mengembangkan abstraksi suara yang cukup untuk template. (Karena jika aku punya, itu akan punya nama.)
Saya bisa memilih untuk membuat perkenalan membutuhkan sebuah ekspresi. Itu sebenarnya lebih buruk, karena praktis semua kendala Anda akan mulai terlihat seperti ini:
template<typename T>
requires { requires Eq<T>; }
void f(T a, T b);
Di sini, persyaratan ke-2 disebut persyaratan bersarang; ia mengevaluasi ekspresinya (kode lain dalam blok ekspresi-kebutuhan tidak dievaluasi). Saya pikir ini jauh lebih buruk daripada status quo. Sekarang, Anda bisa menulis membutuhkan dua kali di mana-mana.
Saya juga bisa menggunakan lebih banyak kata kunci. Ini masalah tersendiri --- dan bukan hanya menumpahkan sepeda. Mungkin ada cara untuk "mendistribusikan kembali" kata kunci untuk menghindari duplikasi, tapi saya belum memikirkan itu. Tapi itu tidak benar-benar mengubah esensi masalah.
noexcept(noexcept(...))
.