2011-02-09 14 views
45

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

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

    static void f(); 
}; 

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

test.cpp: In lambda function:
test.cpp:44:21: error: 'this' was not captured for this lambda function

(दिलचस्प है, जी ++ 4.5 कोड ठीक संकलित)।

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

+17

पर ठीक संकलित करेगा जो एक बग होगा। –

+2

अभी भी जीसीसी 4.7.2 में एक बग। एक कैप्चर के रूप में 'यह' जोड़ना अभी भी काम करता है। –

+1

जीसीसी 4.8 में फिक्स्ड। – akim

उत्तर

32

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

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

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

वे लैम्ब्डा के अधिक बदसूरत बना दिया है सकते हैं? इसका उत्तर मत दो। कम से कम हम उन्हें मिला है। – wheaties

+32

@wheaties मैं निराश वे 'में काम नहीं कर सकता है <>' किसी भी तरह कर रहा हूँ। बस ब्रैकेट के पूर्ण सेट के लिए जाने के लिए ... – KitsuneYMG

+20

@ किट्स्यूनवाईएमजी: http://msdn.microsoft.com/en-us/library/dd293599.aspx पर एक उदाहरण है: auto g = [] (int x) -> समारोह {वापसी [=] (int y) {वापसी x + y; }; }; – TonyK

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

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