2017-04-18 6 views
15

एक अवधारणा परिभाषा का शरीर है या अनिवार्य संदर्भ ब्लॉक की आवश्यकता है? जैसे। क्या मैं std::declval सुरक्षित रूप से उपयोग कर सकता हूं?क्या शरीर के लिए अनिवार्य संदर्भ ब्लॉक की आवश्यकता है?

template<typename T> 
concept bool SomeConcept = requires(T a) { 
    { a.someFunction(std::declval<int>()) } -> int; 
}; 

उत्तर

14

हां। [Temp.constr.expr], N4641 के रूप में शब्दों से:

एक अभिव्यक्ति बाधा की कोई समस्या है कि टेम्पलेट तर्कों के प्रतिस्थापन के माध्यम से एक अभिव्यक्तिE के गठन पर एक आवश्यकता को निर्दिष्ट करता है। E उपज में प्रतिस्थापन विफल नहीं होने पर एक अभिव्यक्ति बाधा संतुष्ट होती है। एक अभिव्यक्ति बाधा के भीतर, E एक अनियमित ऑपरेंड (क्लॉज 5) है।

तो declval का उपयोग करना ठीक होना चाहिए।

वैकल्पिक रूप से, तुम सिर्फ प्रकार आप आवश्यकताओं के संदर्भ में के बाद से जरूरत की वस्तुओं बना सकते हैं, हम वास्तव में कुछ भी निर्माण नहीं कर रहे हैं:

template<typename T> 
concept bool SomeConcept = requires(T a, int i) { 
    { a.someFunction(std::move(i)) } -> int; 
}; 
+0

धन्यवाद बैरी! वैसे, क्या अधिक पठनीय वाक्यविन्यास के बजाय चर प्राप्त करने के लिए कोई अन्य लाभ है? क्या यह सिर्फ बेहतर अभ्यास है या कुछ नुकसान हैं जिनके बारे में मुझे अवगत होना चाहिए? –

+0

@ गुइलाउमरासिकोट शायद बेहतर अभ्यास के बारे में बात करने के लिए थोड़ा जल्दी। व्यक्तिगत रूप से, मैं जहां संभव हो वहां सभी पूर्व-अवधारणाओं मेटाप्रोग्रामिंग हैक्स से बचना चाहता हूं। – Barry

संबंधित मुद्दे

 संबंधित मुद्दे