c++ - लैम्बडास को स्थिर सदस्य समारोह को कॉल करने के लिए 'इस' को कैप्चर करने की आवश्यकता है?




lambda c++11 (2)

मैं सहमत हूं, इसे ठीक से संकलित करना चाहिए। फिक्स के लिए (यदि आप पहले से ही नहीं जानते थे), बस संदर्भ कैप्चर जोड़ें और यह जीसीसी 4.6 पर ठीक संकलित करेगा

struct B
{
    void g()
    {
        [&]() { B::f(); }();
    }

    static void f() { std::cout << "Hello World" << std::endl; };
};

निम्नलिखित कोड के लिए:

struct B
{
    void g()
    {
        []() { B::f(); }();
    }

    static void f();
};

जी ++ 4.6 त्रुटि देता है:

test.cpp: लैम्ब्डा फ़ंक्शन में:
test.cpp: 44: 21: त्रुटि: 'यह' इस लैम्ब्डा फ़ंक्शन के लिए कैद नहीं किया गया था

(दिलचस्प बात यह है कि जी ++ 4.5 कोड ठीक करता है)।

क्या यह g ++ 4.6 में एक बग है, या क्या यह स्थिर सदस्य फ़ंक्शन को कॉल करने में सक्षम होने के लिए 'इस' पैरामीटर को कैप्चर करना वाकई आवश्यक है? मुझे नहीं लगता कि यह क्यों होना चाहिए, मैंने भी B:: साथ कॉल योग्यता प्राप्त की।


कुछ कंपाइलर्स के साथ, नए का डीबग संस्करण डेटा शुरू करेगा, लेकिन निश्चित रूप से कुछ भी नहीं है जिस पर आप भरोसा कर सकते हैं।

यह भी संभव है कि स्मृति के पिछले उपयोग से 0 था। यह न मानें कि हटाए गए और नए के बीच स्मृति के साथ कुछ भी नहीं हुआ। पृष्ठभूमि में कुछ ऐसा किया जा सकता है जिसे आपने कभी नहीं देखा। साथ ही, वही पॉइंटर मान एक ही भौतिक स्मृति नहीं हो सकता है। मेमोरी पेज ले जाया जाता है और बाहर और अंदर पेज़ किया जाता है। एक पॉइंटर को पहले की तुलना में पूरी तरह से अलग स्थान पर मैप किया जा सकता है।

निचली पंक्ति: यदि आपने विशेष रूप से स्मृति स्थान प्रारंभ नहीं किया है तो आप इसकी सामग्री के बारे में कुछ भी नहीं मान सकते हैं। जब तक आप स्मृति का उपयोग नहीं करते हैं तब तक मेमोरी मैनेजर एक विशिष्ट भौतिक स्मृति स्थान आवंटित नहीं कर सकता है।

आधुनिक स्मृति प्रबंधन आश्चर्यजनक रूप से जटिल है, लेकिन एक सी ++ प्रोग्रामर के रूप में आप वास्तव में परवाह नहीं करते हैं (ज्यादातर ‡)। नियमों के अनुसार खेलते हैं और आपको परेशानी नहीं होगी।

‡ आप पेज दोषों को कम करने के लिए अनुकूलित कर रहे हैं तो आप परवाह कर सकते हैं।





c++ lambda c++11