जब "यह" लंबोदर द्वारा कब्जा कर लिया जाता है, तो क्या इसे स्पष्ट रूप से उपयोग किया जाना है?


27

जिन उदाहरणों से मैंने पाया है कि thisएक लंबोदर में कब्जा स्पष्ट रूप से उपयोग करता है; उदाहरण के लिए:

capturecomplete = [this](){this->calstage1done();};

लेकिन ऐसा लगता है कि इसका उपयोग करना भी संभव है; उदाहरण के लिए:

capturecomplete = [this](){calstage1done();};

मैंने इसे g ++ में जांचा, और इसे संकलित किया।

क्या यह मानक C ++ है? (और यदि हां, तो कौन सा संस्करण), या क्या यह विस्तार का कोई रूप है?


1
उत्तर सही हैं, लेकिन this->स्पष्ट रूप से उपयोग करने का एक संभावित कारण है , जो यह सुनिश्चित करना है कि स्पष्ट रूप से कैप्चर किए गए मानों का उपयोग स्पष्ट रूप से किया जाता है। ध्यान दें कि [](){ calstage1done(); }कानूनी नहीं होगा, क्योंकि thisकब्जा नहीं किया जाएगा; लेकिन thisस्पष्ट रूप से कैप्चर करने पर , फ़ंक्शन बॉडी के लिए एक नज़र में प्रकट होना आश्चर्यजनक है कि वास्तव में कैप्चर किए गए मूल्य का उपयोग न करें [this](){ calstage1done(); }:।
काइल स्ट्रैंड

मैं इसे देख सकता हूं, लेकिन एक ही समय में यह भयावह लगता है कि एक साधारण कार्य क्या होना चाहिए।
प्लग

1
मुझे याद है कि MSVC (शायद केवल 2015) भी this
लैंबडा

@plugwash: डेवलपर्स हमेशा आलसी हो जाते हैं और चीजों को कम करना चाहते हैं, और भाषा डिजाइनर अलग नहीं हैं। हालांकि, अस्पष्टता को हल करने के लिए अक्सर वर्बोसिटी की आवश्यकता होती है, और यही स्थिति यहां है।
फ्लेटर

जवाबों:


25

यह मानक है और सी ++ 11 के बाद से इस तरह से किया गया है जब लैम्ब्डा को जोड़ा गया था। Cppreference.com के अनुसार :

नाम देखने के उद्देश्य के लिए, thisसूचक के प्रकार और मूल्य का निर्धारण और गैर-स्थिर वर्ग के सदस्यों तक पहुँचने के लिए, बंद प्रकार के फ़ंक्शन कॉल ऑपरेटर के शरीर को लैम्ब्डा-अभिव्यक्ति के संदर्भ में माना जाता है।

struct X {
    int x, y;
    int operator()(int);
    void f()
    {
        // the context of the following lambda is the member function X::f
        [=]()->int
        {
            return operator()(this->x + y); // X::operator()(this->x + (*this).y)
                                            // this has type X*
        };
    }
};

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.