मुझे एंड्रयू सुटन (कॉन्सेप्ट के लेखकों में से एक, जिसने इसे gcc में लागू किया था) से एक टिप्पणी मिली, जो इस संबंध में काफी मददगार है, इसलिए मैंने सोचा कि मैं इसे इसके निकट-पूर्णता में उद्धृत करूंगा:
बहुत पहले की आवश्यकता नहीं है, अभिव्यक्ति (दूसरी आवश्यकताओं द्वारा प्रस्तुत वाक्यांश) को बाधा-अभिव्यक्तियों (पहली आवश्यकताओं द्वारा प्रस्तुत वाक्यांश) में अनुमति नहीं दी गई थी। यह केवल अवधारणा परिभाषाओं में प्रकट हो सकता है। वास्तव में, यह वही है जो उस कागज के अनुभाग में प्रस्तावित है जहां वह दावा प्रकट होता है।
हालांकि, 2016 में, उस प्रतिबंध को शिथिल करने का प्रस्ताव था [संपादक का नोट: P0266 ]। पेपर के खंड 4 में पैरा 4 के स्ट्राइकथ्रू पर ध्यान दें। और इस तरह पैदा हुआ था आवश्यकता की आवश्यकता है।
सच बताने के लिए, मैंने वास्तव में जीसीसी में उस प्रतिबंध को कभी लागू नहीं किया था, इसलिए यह हमेशा संभव था। मुझे लगता है कि वाल्टर ने उस कागज को खोजा और उसे उपयोगी पाया होगा।
किसी को भी यह नहीं लगता है कि मैं दो बार लिखने के लिए संवेदनशील नहीं था, मैंने यह निर्धारित करने में कुछ समय बिताया कि क्या इसे सरल बनाया जा सकता है। संक्षिप्त उत्तर: नहीं।
समस्या यह है कि दो व्याकरणिक निर्माण हैं जिन्हें टेम्पलेट पैरामीटर सूची के बाद पेश करने की आवश्यकता है: बहुत ही सामान्य रूप से एक बाधा अभिव्यक्ति (जैसे P && Q
) और कभी-कभी वाक्यगत आवश्यकताएं (जैसे requires (T a) { ... }
)। इसे एक आवश्यकता-अभिव्यक्ति कहा जाता है।
पहली आवश्यकता बाधा का परिचय देती है। दूसरा आवश्यकता-अभिव्यक्ति का परिचय देता है। जिस तरह से व्याकरण रचना करता है। मुझे यह बिल्कुल भ्रामक नहीं लगता।
मैंने कोशिश की, एक बिंदु पर, इन्हें एक ही आवश्यकता के रूप में ढहाने के लिए। दुर्भाग्य से, यह कुछ गंभीर रूप से कठिन पार्सिंग समस्याओं की ओर जाता है। आप आसानी से नहीं बता सकते हैं, उदाहरण के लिए यदि (
आवश्यकता के बाद नेस्टेड सब-डेप्रिसिएशन या पैरामीटर-सूची को दर्शाता है। मुझे विश्वास नहीं है कि उन सिंटैक्स का एक पूर्ण विस्मरण है (यूनिफ़ॉर्म इनिशियलाइज़ेशन सिंटैक्स के लिए तर्क देखें; यह समस्या वहाँ भी है)।
तो आप एक विकल्प बनाते हैं: मेक इन ए एक्सप्रेशन की आवश्यकता है (जैसा कि यह अभी करता है) या इसे आवश्यकताओं की एक मानकीकृत सूची का परिचय दें।
मैंने वर्तमान दृष्टिकोण को चुना क्योंकि अधिकांश समय (लगभग 100% समय में), मैं एक आवश्यकता-अभिव्यक्ति के अलावा कुछ और चाहता हूं। और बहुत ही दुर्लभ मामले में मैं तदर्थ बाधाओं के लिए एक आवश्यकता-अभिव्यक्ति चाहता था, मुझे वास्तव में दो बार शब्द लिखने में कोई आपत्ति नहीं है। यह एक स्पष्ट संकेतक है कि मैंने टेम्पलेट के लिए पर्याप्त ध्वनि अमूर्तता विकसित नहीं की है। (क्योंकि अगर मेरे पास होता तो इसका एक नाम होता।)
मैं एक आवश्यकता-अभिव्यक्ति की आवश्यकता को लागू करने के लिए चुना जा सकता था। यह वास्तव में बदतर है, क्योंकि व्यावहारिक रूप से आपके सभी अवरोध इस तरह दिखने लगेंगे:
template<typename T>
requires { requires Eq<T>; }
void f(T a, T b);
यहां, 2 की आवश्यकता को नेस्टेड-आवश्यकता कहा जाता है; यह अपनी अभिव्यक्ति का मूल्यांकन करता है (आवश्यकता-अभिव्यक्ति के ब्लॉक में अन्य कोड का मूल्यांकन नहीं किया जाता है)। मुझे लगता है कि यह यथास्थिति से भी बदतर है। अब, आपको हर जगह दो बार लिखने की आवश्यकता है।
मैं और भी कीवर्ड इस्तेमाल कर सकता था। यह अपने आप में एक समस्या है --- और यह सिर्फ बाइक शेडिंग नहीं है। दोहराव से बचने के लिए कीवर्ड को "पुनर्वितरित" करने का एक तरीका हो सकता है, लेकिन मैंने उस गंभीर विचार को नहीं दिया है। लेकिन यह वास्तव में समस्या का सार नहीं बदलता है।
noexcept(noexcept(...))
।