दिलचस्प पोस्ट
MySQL योग () एकाधिक कॉलम परावर्तन (डॉटनेट) का उपयोग करते हुए एक विधानसभा में सभी नामस्थान ढूँढना इष्टतम फ़ाइल बफर आकार पढ़ा है? जर्सी सुरक्षा और सत्र प्रबंधन मिक्सिंस बनाम फॉरेक्ट्स अजगर में कई प्रक्रियाओं से सिंगल फाइल प्रोसेसिंग मैं कक्षा से स्टोरीबोर्ड प्रोग्राम को कैसे लोड कर सकता हूं? Xcode को एक पुराने एसडीके में कैसे इंगित करें ताकि इसे "बेस एसडीके" के रूप में इस्तेमाल किया जा सके? सी ++ वेक्टर, ऑब्जेक्ट्स, फ्री मेमोरी डिलीट करें Jquery $ वास्तव में वापस क्या करता है? Android में कैमरा ओरिएंटेशन समस्या Python में glob.glob मॉड्यूल का उपयोग करके मैं उप-फ़ोल्डर्स कैसे खोज सकता हूं? यह निर्धारित करने के लिए कि एक एनोटेशन MKPolygonView (आईओएस) के अंदर है या नहीं रीसाइज़िंग विंडो के दौरान ऑटो आकार का आकार (फ़ॉन्ट आकार)? .एपी फ़ाइल Xcode 4 के साथ नई परियोजनाओं में लाल (गायब) में दिखाई देती है

सी ++ 11 में "ऑटो" के साथ अनुमानित लैम्ब्डा का क्या प्रकार है?

मुझे एक धारणा थी कि, लैम्ब्डा का प्रकार फ़ंक्शन पॉइंटर है। जब मैंने निम्नलिखित परीक्षण किया, तो मैंने इसे गलत ( डेमो ) पाया।

#define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! } 

कोड से ऊपर कोई भी बिंदु गायब है? यदि नहीं, तो auto खोजशब्द के साथ deduced जब लैम्ब्डा अभिव्यक्ति का typeof क्या है?

Solutions Collecting From Web of "सी ++ 11 में "ऑटो" के साथ अनुमानित लैम्ब्डा का क्या प्रकार है?"

लैम्ब्डा अभिव्यक्ति का प्रकार अनिर्दिष्ट है।

लेकिन वे आम तौर पर फ़ैंटर्स के लिए केवल वाक्यात्मक चीनी होते हैं। एक लैम्ब्डा सीधे एक फैक्टर में अनुवादित होता है। [] अंदर कुछ भी कंसट्रेटर मापदंडों और मस्तक वस्तु के सदस्यों में बदल जाता है, और () पैरामीटर () फ़ैक्टक्टर operator() के लिए पैरामीटर्स में बदल जाते हैं।

एक लैम्ब्डा, जिसमें कोई चर नहीं है ( [] अंदर कुछ भी नहीं) एक फ़ंक्शन पॉइंटर में परिवर्तित किया जा सकता है (एमएसवीसी 2010 इस का समर्थन नहीं करता है, अगर यह आपके कंपाइलर है, लेकिन यह रूपांतरण मानक का हिस्सा है)।

लेकिन लैम्ब्डा का वास्तविक प्रकार फ़ंक्शन पॉइंटर नहीं है। यह कुछ अनिर्दिष्ट आनुवंशिक प्रकार का प्रकार है

यह एक अनोखी अनाम संरचना है जो फ़ंक्शन कॉल ऑपरेटर को ओवरलोड करता है। लैम्ब्डा का हर उदाहरण एक नया प्रकार प्रस्तुत करता है।

एक गैर-कैप्चरिंग लैम्ब्डा के विशेष मामले में, संरचना के अलावा फ़ंक्शन पॉइंटर में एक अंतर्निहित रूपांतरण होता है।

[C++11: 5.1.2/3]: लैम्ब्डा-अभिव्यक्ति का प्रकार (जो बंद ऑब्जेक्ट का प्रकार भी है) एक अनोखी, अनाम गैर-यूनियन वर्ग प्रकार है – जिसे क्लोजर प्रकार कहा जाता है – जिसका गुण हैं नीचे वर्णित। यह वर्ग प्रकार एक समग्र (8.5.1) नहीं है बंद ब्लॉक प्रकार, वर्ग के दायरे, या नेमस्पेस क्षेत्र में घोषित किया जाता है जिसमें संबंधित लैम्ब्डा-अभिव्यक्ति होती है[..]

इस प्रकार के विभिन्न गुणों को सूचीबद्ध करने के लिए इस खंड पर चला जाता है यहां कुछ प्रकाश डाला गया है:

[C++11: 5.1.2/5]: लैम्ब्डा-अभिव्यक्ति के लिए समापन प्रकार एक सार्वजनिक inline फ़ंक्शन कॉल ऑपरेटर (13.5.4) है जिसका पैरामीटर और वापसी प्रकार लैम्ब्डा-अभिव्यक्ति के पैरामीटर-घोषणा द्वारा वर्णित है क्रम अनुक्रम और अनुगामी-वापसी प्रकार [..]

[C++11: 5.1.2/6]: लैम्ब्डा-कैप्चर के साथ लैम्ब्डा-अभिव्यक्ति के लिए बंद प्रकार एक सार्वजनिक गैर-आभासी गैर स्पष्ट कॉन्स्ट कन्वर्ज़न फंक्शन है जिसमें पॉइंट को समान पैरामीटर और वापसी प्रकार के रूप में कार्य किया जाता है क्लोजर का प्रकार फ़ंक्शन कॉल ऑपरेटर इस कनवर्ज़न फ़ंक्शन द्वारा लौटा जाने वाला मूल्य एक ऐसे फ़ंक्शन का पता होगा जो कि जब लागू होता है, तो बंद होने वाले प्रकार के फ़ंक्शन कॉल ऑपरेटर को लागू करने के समान ही प्रभाव पड़ता है।

इस अंतिम मार्ग का नतीजा यह है कि, यदि आपने रूपांतरण का इस्तेमाल किया है, तो आप pFptr को LAMBDA को आवंटित करने में सक्षम pFptr

एक व्यावहारिक समाधान से कैसे मैं एक क्लास सदस्य के रूप में एक बढ़ावा :: बाँध वस्तु को संग्रहीत कर सकता हूं? , boost::function<void(int)> या std::function<void(int)>

 #include <iostream> #include <typeinfo> #define LAMBDA [] (int i)->long { return 0l; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok std::cout<<typeid( *pAuto ).name() << std::endl; std::cout<<typeid( *pFptr ).name() << std::endl; std::cout<<typeid( pAuto ).name() << std::endl; std::cout<<typeid( pFptr ).name() << std::endl; } 

फ़ंक्शन के प्रकार वास्तव में एक ही हैं, लेकिन लैम्ब्डा नए प्रकार का परिचय देता है (जैसे एक मजेदार)

यह भी ध्यान देना चाहिए कि लैम्ब्डा फ़ंक्शन पॉइंटर के लिए परिवर्तनीय है। हालांकि टाइपिड <> एक गैर- trvial ऑब्जेक्ट देता है जो लैम्ब्डा से जेनेरिक फ़ंक्शन पॉइंटर से अलग होना चाहिए। इसलिए typeid के लिए परीक्षण <> एक वैध धारणा नहीं है सामान्य सी ++ 11 में हम टाइप विनिर्देशन के बारे में चिंता नहीं करना चाहते हैं, यदि कोई निश्चित प्रकार एक लक्ष्य प्रकार के लिए परिवर्तनीय है तो यह सब बात है।