संभव डुप्लिकेट:
Recursive lambda functions in c++0xरिकर्सिव कॉल (सी ++ 11)
मैं एक लैम्ब्डा क्यों फोन नहीं कर सकते हैं रिकर्सिवली अगर मैं के रूप में यह लिखें:
auto a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a(); //recursive call
};
यह संकलन त्रुटि देता है (ideone):
prog.cpp:8:18: error: '((const main()::<lambda()>*)this)->main()::<lambda()>::a' cannot be used as a function
prog.cpp: In function 'int main()':
prog.cpp:9:9: error: variable 'auto a' with 'auto' type used in its own initializer
त्रुटि का क्या अर्थ है?
मैं कारण क्यों मैं यह नहीं लिख सकते हैं:
auto i=i+1; //error: unable to deduce 'auto' from '<expression error>'
हम इस नहीं लिख सकते हैं क्योंकि i
के प्रकार यह आरंभीकरण, किस प्रकार करता है, तो निष्कर्ष निकाला नहीं जा सकता है इसका मतलब है से निष्कर्ष निकाला जाना है i
स्वयं प्रारंभ में दिखाई देता है (ideone)। लेकिन लैम्ब्डा के मामले में यह कैसे मायने रखता है? यदि मैं गलत नहीं हूं, तो लैम्ब्डा का प्रकार इसके पैरामीटर (रिटर्न) और रिटर्न प्रकार द्वारा निर्धारित होता है; यह शरीर पर निर्भर नहीं करता है अगर यह कुछ भी नहीं लौटाता है (इस मामले में, वापसी प्रकार को void
के रूप में घटाया जाता है, चाहे लैम्ब्डा-बॉडी में अन्य बयानों के बावजूद)।
वैसे भी, मैं एक वैकल्पिक हल मिल गया है, और मैं के रूप में के बजाय std::function
उपयोग कर सकते हैं:
std::function<void()> a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a();
};
जो जुर्माना संकलन (ideone)। लेकिन मुझे अभी भी यह जानने में दिलचस्पी है कि auto
संस्करण संकलित क्यों नहीं करता है।
मुझे लगता है कि समस्या आपको 'ए' के निहित कैप्चर के साथ समाप्त होने से संबंधित है, एक संदर्भ के रूप में जो असीमित रूप से पुन: कार्य करेगा क्योंकि 'ए' स्वयं 'ए' के सदस्य के रूप में समाप्त होता है। – Flexo
@awoodland: इसका क्या अर्थ है? कृपया उस पर विस्तृत करें। – Nawaz
लैम्ब्डा का प्रकार भी कैप्चर पर निर्भर करता है, जो मुझे संदेह है कि यह मुद्दा यहां है। यदि आप 'ए' का उपयोग नहीं करते हैं तो कंपाइलर परवाह नहीं है, लेकिन जब आप ऐसा करते हैं तो यह नहीं पता कि किस प्रकार की ऑब्जेक्ट का उपयोग करना है। –