ऐसा लगता है कि आप एक ही हस्ताक्षर के साथ एक समारोह बनाने के लिए किसी अन्य फ़ंक्शन के हस्ताक्षर को "कॉपी" करना चाहते हैं। चूंकि decltype(foo)
वास्तव में फ़ंक्शन का प्रकार है (और उस फ़ंक्शन के लिए पॉइंटर नहीं है, जो decltype(&foo)
होगा और एक सूचक घोषणा के लिए नेतृत्व करेगा), आप इसे किसी अन्य फ़ंक्शन के समान हस्ताक्षर के साथ फ़ंक्शन घोषित करने के लिए उपयोग कर सकते हैं।
लिंकर त्रुटि ने संकेत के रूप में:
undefined reference to `Bar::blubb(int)'
यह पहले से ही अपने संकलक के साथ ठीक से काम करेगा। हालांकि ऐसा लगता है कि जीसीसी ने अभी तक मानक के इस हिस्से को पूरी तरह कार्यान्वित नहीं किया है, क्योंकि यह फ़ंक्शन कॉल ऑपरेटर के साथ एक ही चीज़ के सिंटैक्स को स्वीकार नहीं करेगा। क्लैंग बीटीडब्ल्यू खुशी से यह और लिंक तो
undefined reference to `Bar::operator()(int)'
क्यों कि लिंकर त्रुटि मौजूद है के बारे में आपका प्रश्न के साथ बाहर स्वीकार करेंगे त्रुटियों क्या decltype वास्तव में करता है की एक गलतफहमी इंगित करता है।
यह सिर्फ एक प्रकार का मूल्यांकन करेगा, और अधिक नहीं। blubb
की परिभाषा foo
की परिभाषा से बंधी नहीं है। यह स्पष्ट है जब यह की तरह
typedef decltype(foo) x;
x blubb;
लेखन हो सकता है अब आप वैकल्पिक रूप से typedef एक्स स्पष्ट रूप से समारोह का प्रकार, हो सकता है जो किसी भी तरह से परिवर्तन blubb है क्या में नहीं होगा। आपको अभी भी इसे परिभाषित करने की आवश्यकता है।और के बाद से वहाँ decltype का उपयोग कर इसे परिभाषित करने की कोई वाक्य रचना है, तो आप स्पष्ट रूप से के रूप में
int Bar::operator()(int) {
...
}
यह लिखने के लिए जो संभावना और दुर्भाग्य से, घोषणा के लिए decltype का उपयोग करने का उद्देश्य/लाभ को हराने होगा के रूप में यह आप के लिए अनुमति नहीं दी जाएगी राशि हस्ताक्षर स्वचालित रूप से "प्रतिलिपि बनाएँ"।
क्या आप वास्तव में फ़ंक्शन का प्रकार चाहते हैं, या इसके बजाय फ़ंक्शंस रिटर्न टाइप (जिसे आप "अस्वीकरण" जैसे "decltype (foo (0)) से कॉल कर सकते हैं) –
मैं कहूंगा कि जीसीसी अभी तक अभी तक नहीं है इसे लागू किया यह क्लैंग में ठीक काम करता है। – PlasmaHH
@phresnel: यह देखकर कि वह इसे कैसे आमंत्रित करता है ('बार (6)') मुझे लगता है कि वह समारोह चाहता है। हालांकि मुझे आश्चर्य है कि लिंकर त्रुटि एक शिकायत है (फ़ंक्शन को परिभाषित नहीं होने पर इसकी अपेक्षा की जाती है), या सिर्फ यह दिखाने के लिए कि यह फ़ंक्शन को ठीक बनाता है। – PlasmaHH