C ++ 20 में यह निर्णय लेने के लिए एक तंत्र है कि जब एक विशेष विवश इकाई दूसरे की तुलना में "अधिक विवश" है। यह कोई साधारण बात नहीं है।
यह अपने परमाणु घटकों में एक बाधा को तोड़ने की अवधारणा के साथ शुरू होता है, एक प्रक्रिया जिसे बाधा सामान्यीकरण कहा जाता है । यहाँ पर जाना बड़ा और बहुत जटिल है, लेकिन मूल विचार यह है कि एक बाधा में प्रत्येक अभिव्यक्ति अपने परमाणु वैचारिक टुकड़ों में, पुनरावर्ती रूप से टूट जाती है, जब तक कि आप एक घटक उप-अभिव्यक्ति तक नहीं पहुंचते हैं जो एक अवधारणा नहीं है।
तो यह देखते हुए, आइए देखें कि कैसे integral
और signed_integral
अवधारणाओं को परिभाषित किया गया है :
template<class T>
concept integral = is_integral_v<T>;
template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;
का अपघटन integral
सिर्फ है is_integral_v
। का अपघटन signed_integral
है is_integral_v && is_signed_v
।
अब, हम बाधा निर्वाह की अवधारणा पर आते हैं । यह एक तरह से जटिल है, लेकिन मूल विचार यह है कि एक बाधा C1 को C2 के प्रत्येक उप-अभिव्यक्ति में C1 के अपघटन समाहित होने पर एक बाधा C2 "सब्स्टीट्यूट" कहा जाता है। हम देख सकते हैं कि integral
वह उपसमुच्चय नहीं है signed_integral
, लेकिन उपसर्ग signed_integral
करता हैintegral
, क्योंकि इसमें सब कुछ शामिल integral
है।
अगला, हम विवश संस्थाओं को आदेश देने के लिए आते हैं:
एक घोषणा डी 1 कम से कम एक घोषणा डी 2 के रूप में विवश है अगर * डी 1 और डी 2 दोनों विवश घोषणाएं हैं और डी 1 की संबद्ध बाधाएं डी 2 की उन सबको मानती हैं; या * D2 में कोई संबद्ध बाधा नहीं है।
क्योंकि signed_integral
सदस्यता integral
, <signed_integral> wrapper
"के रूप में कम से कम विवश है" के रूप में है <integral> wrapper
। हालांकि, प्रतिवर्ती सत्य नहीं है, क्योंकि प्रतिगमन के प्रतिवर्ती नहीं होने के कारण।
इसलिए, "अधिक विवश" संस्थाओं के लिए नियम के अनुरूप:
एक घोषणा डी 1 एक और घोषणा डी 2 की तुलना में अधिक विवश है जब डी 1 कम से कम डी 2 के रूप में विवश है, और डी 2 कम से कम डी 1 के रूप में विवश नहीं है।
चूँकि <integral> wrapper
, कम से कम उतने विवश नहीं हैं जितना <signed_integral> wrapper
कि बाद वाले को पूर्व की तुलना में अधिक विवश माना जाता है।
और इसलिए, जब दोनों में से दोनों आवेदन कर सकते हैं, तो अधिक विवश घोषणा जीत जाती है।
ध्यान रखें कि जब अभिव्यक्ति का सामना नहीं होता है तो बाधा निर्वाह के नियम बंद हो जाते हैं concept
। तो अगर आपने ऐसा किया है:
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>;
इस मामले में, सदस्यता my_signed_integral
नहीं होगीstd::integral
। भले ही my_is_integral_v
यह परंपरागत रूप से परिभाषित किया गया हो std::is_integral_v
, क्योंकि यह एक अवधारणा नहीं है, C ++ की सदस्यता नियम इसके माध्यम से यह निर्धारित नहीं कर सकते हैं कि वे समान हैं।
इसलिए निर्विवाद नियम आपको परमाणु अवधारणाओं पर संचालन से बाहर अवधारणाओं का निर्माण करने के लिए प्रोत्साहित करते हैं।