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 integraldan signed_integralkonsep didefinisikan :
template<class T>
concept integral = is_integral_v<T>;
template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;
Dekomposisi integraladalah adil is_integral_v. Dekomposisi signed_integraladalah 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 integralitu 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_integralbersubsidi integral, <signed_integral> wrapperitu "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> wrappersetidaknya 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_vdidefinisikan 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.