2013-10-30 9 views
22

द्वारा संदर्भ कैसे प्राप्त किया जा रहा है यदि संदर्भ-प्रकार का चर लैम्बडा में मूल्य से कैप्चर किया जा रहा है, तो क्या इसे संदर्भ या मूल्य से कैद किया जा रहा है? सवाल के साथलैम्ब्डा में,

छोटा सा नमूना:

#include <iostream> 

struct Test { 
    int a; 
}; 

void testFunc(const Test &test) { 
    auto a = [=] { 
    // does 'test' is being passed to closure object with copy 
    // or by reference? 
    return test.a; 
    }(); 
    std::cout << a; 
} 

int main() { 
    Test test{1}; 
    testFunc(test); 
} 
+2

अच्छा, इसका परीक्षण करने के बारे में क्या? (आपको इसके लिए ऑब्जेक्ट को संशोधित करने की आवश्यकता है, जिसे गैर-कॉन्स्ट संदर्भ के साथ या परिवर्तनीय 'म्यूटेबल' बनाकर हासिल किया जा सकता है।) –

+0

[value] (http://ideone.com/R0HclW) द्वारा दिखाई देता है)। –

+0

@JanHudec हां, परीक्षण अच्छा है, लेकिन यह हमेशा संबंधित मानक वर्गों और सैद्धांतिक रूप से आधारित उत्तर देखने के लिए उपयोगी होता है (SO पर ऐसे कई विशेषज्ञ हैं)। – Yury

उत्तर

19

मूल्य तक। Compilable उदाहरण:

class C 
{ 
public: 
    C() 
    { 
     i = 0; 
    } 

    C(const C & source) 
    { 
     std::cout << "Copy ctor called\n"; 
     i = source.i; 
    } 

    int i; 
}; 

void test(C & c) 
{ 
    c.i = 20; 

    auto lambda = [=]() mutable { 

     c.i = 55; 
    }; 
    lambda(); 

    std::cout << c.i << "\n"; 
} 

int main(int argc, char * argv[]) 
{ 
    C c; 
    test(c); 

    getchar(); 
} 

परिणाम:

Copy ctor called 
20

मुझे लगता है, कि सी ++ मानक के इस पैरा लागू होता है:

5.1.2 लैम्ब्डा भाव

(...) 14. प्रति द्वारा एक इकाई पर कब्जा कर लिया गया है यदि यह पूरी तरह से कब्जा कर लिया गया है और कैप्चर-डिफ़ॉल्ट = या यदि यह स्पष्ट रूप से पर कब्जा कर लिया गया है जिसमें एक & कॉपी द्वारा कब्जा कर लिया गया प्रत्येक इकाई के लिए, एक अज्ञात nonstatic डेटा सदस्य को बंद करने के प्रकार में घोषित किया जाता है। इन सदस्यों का घोषणा आदेश अनिर्दिष्ट है। ऐसे डेटा सदस्य का प्रकार संबंधित कैप्चर किए गए इकाई का प्रकार है यदि इकाई किसी ऑब्जेक्ट के संदर्भ में नहीं है, या संदर्भित प्रकार अन्यथा। [ नोट: यदि कब्जा इकाई फ़ंक्शन का संदर्भ है, तो संबंधित डेटा सदस्य फ़ंक्शन का संदर्भ भी है। - अंत नोट]

यह वास्तव में समझ में आता है - यदि स्थानीय चर को संदर्भ में स्थानीय चर के रूप में संदर्भ "कार्य" द्वारा पारित मान और पैरामीटर द्वारा पारित किया जाता है, तो इसे मूल्य के बजाय संदर्भ द्वारा क्यों पारित किया जाएगा?

+2

दावा के लिए कोई संदर्भ (जैसे विनिर्देश से सेक्शन और अनुच्छेद संख्या)? –

+5

मुझे लगता है कि महत्वपूर्ण कारण यह है कि मूल्य से कैप्चरिंग वहां है, इसलिए चर बंद होने तक चर मान्य है। अगर संदर्भ छीन नहीं गया तो कौन काम नहीं करेगा। –

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