C ++ 20 memiliki mekanisme untuk memutuskan ketika satu entitas terbatas tertentu "lebih terbatas" daripada yang lain. Ini bukan hal yang sederhana.
Ini dimulai dengan konsep memecah kendala menjadi komponen atomnya, sebuah proses yang disebut normalisasi kendala . Ini besar dan terlalu rumit untuk dimasukkan ke sini, tetapi ide dasarnya adalah bahwa setiap ekspresi dalam batasan dipecah menjadi potongan-potongan konseptual atom, secara rekursif, sampai Anda mencapai sub-ekspresi komponen yang bukan konsep.
Karena itu, mari kita lihat bagaimana integral
dan signed_integral
konsep didefinisikan :
template<class T>
concept integral = is_integral_v<T>;
template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;
Dekomposisi integral
adalah adil is_integral_v
. Dekomposisi signed_integral
adalah is_integral_v && is_signed_v
.
Sekarang, kita sampai pada konsep subsumption kendala . Agak rumit, tetapi ide dasarnya adalah bahwa kendala C1 dikatakan "subsume" kendala C2 jika dekomposisi C1 berisi setiap sub-ekspresi dalam C2. Kita dapat melihat bahwa integral
itu tidak merangkum signed_integral
, tetapi signed_integral
juga menggabung integral
, karena itu berisi semuanya integral
.
Selanjutnya, kita sampai pada pemesanan entitas terbatas:
Deklarasi D1 setidaknya dibatasi sebagai deklarasi D2 jika * D1 dan D2 keduanya deklarasi terkendala dan kendala terkait D1 termasuk yang dari D2; atau * D2 tidak memiliki kendala terkait.
Karena signed_integral
bersubsidi integral
, <signed_integral> wrapper
itu "setidaknya dibatasi" sebagai <integral> wrapper
. Namun, kebalikannya tidak benar, karena subsuminya tidak dapat dibalikkan.
Oleh karena itu, sesuai dengan aturan untuk entitas yang "lebih terbatas":
Deklarasi D1 lebih dibatasi daripada deklarasi D2 lain ketika D1 setidaknya sama dibatasi dengan D2, dan D2 setidaknya tidak dibatasi seperti D1.
Karena <integral> wrapper
setidaknya tidak dibatasi <signed_integral> wrapper
, maka yang terakhir dianggap lebih dibatasi daripada yang sebelumnya.
Dan karena itu, ketika keduanya bisa berlaku, deklarasi yang lebih terbatas menang.
Ketahuilah bahwa aturan pembatas subsubs berhenti ketika ekspresi ditemukan yang bukan a concept
. Jadi, jika Anda melakukan ini:
template<typename T>
constexpr bool my_is_integral_v = std::is_integral_v<T>;
template<typename T>
concept my_signed_integral = my_is_integral_v<T> && std::is_signed_v<T>;
Dalam hal ini, my_signed_integral
tidak akan berlangganan std::integral
. Meskipun my_is_integral_v
didefinisikan secara identik std::is_integral_v
, karena itu bukan konsep, aturan subsumsi C ++ tidak dapat mengintip melalui itu untuk menentukan bahwa mereka sama.
Jadi aturan subsumsi mendorong Anda untuk membangun konsep dari operasi pada konsep atom.