2013-07-12 11 views
17

यदि कोई फ़ंक्शन टेम्पलेट decltype(auto) (या auto का उपयोग करके अन्य प्रकार का विनिर्देशक) लौटाता है लेकिन वापसी का विवरण खराब हो जाएगा, तो SFINAE परिणाम क्या होता है? return कथन फ़ंक्शन हस्ताक्षर का तत्काल संदर्भ माना जाता है?SFINAE और decltype (auto)

N3690 ड्राफ्ट में कुछ भी इसकी आवश्यकता नहीं है। डिफ़ॉल्ट रूप से, मुझे लगता है कि SFINAE लागू नहीं होता है।

यह दुर्भाग्यपूर्ण लगता है क्योंकि आप किसी अन्य फ़ंक्शन को आगे बढ़ाने के लिए एक फ़ंक्शन लिख सकते हैं, लेकिन आप लंबे समय तक लिखते समय प्रतिनिधि पर अपने अस्तित्व को सशर्त नहीं बना सकते हैं। इसके अलावा, एक पीयर नॉनस्टैटिक सदस्य फ़ंक्शन के अस्तित्व की जांच decltype(auto) के बिना नहीं की जा सकती है क्योंकि this फ़ंक्शन हस्ताक्षर में उपयोग नहीं किया जा सकता है। हालांकि यह एक मौलिक समस्या को इंगित करता है, क्योंकि decltype(auto) वर्ग प्रकार पर विचार करने के लिए एक सदस्य हस्ताक्षर के भीतर पूरा करने का मार्ग प्रदान करता है, जहां यह नहीं है।

क्या कोई प्रस्ताव लिखा गया है, या समस्या को औपचारिक रूप से कहीं भी विश्लेषण किया गया है?

किसी सदस्य हस्ताक्षर के भीतर कक्षा के प्रकार को पूरा करने की क्षमता के अन्य प्रभाव हो सकते हैं ... लेकिन यह सिर्फ एक और प्रश्न के लिए चारा है।

+0

मैं बिल्कुल यह सोच रहा था। अफसोस की बात है, मैं भी 1y प्रस्तावों का पालन करने के लिए बहुत आलसी रहा है ... – sehe

+0

@MarkGarcia हाँ, यह एक दिया गया है। मैंने अभी प्रश्न के अंत में एक नोट जोड़ा; गैर-टेम्पलेट सदस्य अभी भी ट्वाइलाइट जोन पर एक वर्महोल खोल सकते हैं। – Potatoswatter

+0

यदि प्रश्न में कुछ उदाहरण थे, तो मेरे जैसे बेवकूफों के लिए समझना आसान होता। :) – iammilind

उत्तर

15

लेकिन वापसी का विवरण खराब हो जाएगा, क्या SFINAE परिणाम है?

proposal-n3638 कहते हैं,

SFINAE

के बाद वापसी प्रकार टेम्पलेट, अगर इन्स्टेन्शियशन बीमार बनाई है instantiating द्वारा निष्कर्ष निकाला है, यह एक के बजाय एक त्रुटि का कारण बनता है प्रतिस्थापन विफलता। यह एक ऑटो फ़ंक्शन को लैम्ब्डा लौटने की अनुमति देता है, जो decltype (लौटा अभिव्यक्ति) पैटर्न का उपयोग करना संभव नहीं है।

आशा है कि आप जो खोज रहे हैं।

+1

बिंगो! निश्चित रूप से मैं क्या देख रहा था। मुझे अभी जाना होगा, लेकिन बाद में यह पता चल जाएगा कि वे अपूर्ण प्रकार के साथ सदस्य तत्कालता को कैसे मेल खाते हैं। – Potatoswatter

3

नवाज के लिंक पर के बाद, शेष प्रश्नों N3690 द्वारा उत्तर दिया रहे हैं §7.1.6.4/11:

एक undeduced प्लेसहोल्डर प्रकार के साथ एक इकाई के प्रकार के एक अभिव्यक्ति के प्रकार का निर्धारण करने के लिए की जरूरत है , कार्यक्रम खराब गठित है।

इसका मतलब है कि भले ही एसएफआईएनएई ने रिटर्न टाइप कटौती के साथ काम किया हो, फिर भी इसका इस्तेमाल किसी अन्य से एक समारोह घोषणा के लिए नहीं किया जा सकता था। return कथन संसाधित होने तक हस्ताक्षर अनिवार्य रूप से अमान्य है, जो class {} परिभाषा के समापन ब्रेस पर होता है, और पिछले सदस्यों की परिभाषाओं के बाद संसाधित किया गया है।

एक मायने में, सभी सदस्य decltype(auto) कार्यों एक ही कक्षा में कार्यों पूर्ववर्ती के संबंध में अधूरी हैं:

struct s { 
    void f() { a(); } // error: use of ‘auto s::a()’ before deduction of ‘auto’ 
    auto a() { return 3; } 
}; 

यह जीसीसी की शिकायत है, यदि सदस्य घोषणाएं उलट दी जाती हैं तो यह दूर हो जाती है। ऐसा इसलिए है क्योंकि घोषणा परिभाषा के अनुसार फ़ंक्शन परिभाषाओं को संसाधित किया जाता है, जब कक्षा परिभाषा से } तक पहुंच जाता है।यदि a(); कथन return 3; से पहले संसाधित किया गया है, तो प्रोग्राम खराब बना हुआ है।

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