2017-03-19 24 views
15

http://coliru.stacked-crooked.com/a/29520ad225ced72dलैम्बडा में सदस्य चर को संशोधित करने के लिए [=] का उपयोग क्यों किया जा सकता है?

#include <iostream> 

struct S 
{ 
    void f() 
    { 
     //auto f0 = []  { ++i; }; // error: 'this' was not captured for this lambda function 

     auto f1 = [this] { ++i; };  
     auto f2 = [&] { ++i; }; 
     auto f3 = [=] { ++i; }; 
     f1(); 
     f2(); 
     f3(); 
    } 

    int i = 10; 
}; 

int main() 
{ 
    S s; 
    std::cout << "Before " << s.i << std::endl; 
    s.f(); 
    std::cout << "After " << s.i << std::endl; 
} 

Before 10 
After 13 

प्रश्न: क्यों [=] एक लैम्ब्डा में सदस्य चर के संशोधन सक्षम है?

उत्तर

18

प्रश्न> क्यों [=] लैम्ब्डा में सदस्य चर के संशोधन को सक्षम बनाता है?

क्योंकि "संदर्भ द्वारा मूल्य और मौजूदा वस्तु से लैम्ब्डा के शरीर में ओडीआर रूप से प्रयुक्त सभी स्वत: चर कब्जा करता है, तो मौजूद है" (देखें cpp reference) [=]

तो [=] कब्जा वर्तमान वस्तु संदर्भ द्वारा और कर सकते हैं i संशोधित करें (यह वर्तमान ऑब्जेक्ट का सदस्य है)।

+1

'odr-used' का अर्थ क्या है? – q0987

+1

@ q0987 http://stackoverflow.com/questions/19630570/what-does-it-mean-to-odr-use-something – user2176127

+13

इसके बारे में सोचें कि यह 'मूल्य' मूल्य के आधार पर है। – Yakk

7

आप बराबर तरह से लिखते हैं, इस व्यवहार को और अधिक स्पष्ट हो जाएगा:

auto f3 = [=] { ++(this->i); }; 

आप पकड़ नहीं i लेकिन this, यह स्थिर हो जाएगा, लेकिन बात करने के लिए है कि अपने अंक किसी अन्य सूचक के रूप में संपादित किया जा सकेगा ।

+0

'किसी भी अन्य सूचक के रूप में अच्छी तरह से, कोई सूचक-से-'const' नहीं: पी –

5

आप कल्पना कर सकते है कि [=] कब्जा this मूल्य से, तो this->i तक पहुँचने के लिए की नकल की this का उपयोग कर।

एक प्रतिलिपि this अभी भी आपको ऑब्जेक्ट this अंक तक पहुंचने की अनुमति देता है।

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

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