मैंने कहीं पढ़ा है कि कैप्चर सूची खाली होने पर एक लैम्ब्डा फ़ंक्शन पॉइंटर को कार्य करने का क्षय होना चाहिए। केवल एक ही संदर्भ जो मैं पा सकता हूं वह n3052 है। जी ++ के साथ (4.5 & 4.6) यह अपेक्षा के अनुसार काम करता है, जब तक कि लैम्ब्डा टेम्पलेट कोड के भीतर घोषित नहीं किया जाता है।क्या लैम्ब्डा क्षय टेम्पलेट कोड में पॉइंटर को कार्य करने के लिए चाहिए?
उदाहरण के लिए निम्न कोड को संकलित करता है:
void foo() {
void (*f)(void) = []{};
}
लेकिन यह अब और जब टेम्प्लेट संकलन नहीं करता है (अगर foo
वास्तव में कहीं भी कहा जाता है):
template<class T>
void foo() {
void (*f)(void) = []{};
}
संदर्भ में ऊपर, मैं डॉन इस व्यवहार की व्याख्या नहीं देखते हैं। क्या यह g ++ की अस्थायी सीमा है, और यदि नहीं, तो क्या यह (तकनीकी) कारण है कि इसे अनुमति न दें?
ध्यान दें कि आपके द्वारा उद्धृत एन 3052, वास्तव में सी ++ 0x एफसीडी (एन 30 9 2 5.1.2/6) में शामिल किया गया था। विज़ुअल सी ++ 2010 रूपांतरण को कार्यान्वित नहीं करता है (असुरक्षित, क्योंकि वीसी ++ जारी होने से पहले इसे अनुमति देने वाली भाषा को मानक में शामिल किया गया था)। मैंने माइक्रोसॉफ्ट कनेक्ट पर एक बग रिपोर्ट सबमिट की है (हालांकि मुझे उम्मीद है कि इसे विजुअल सी ++ की अगली रिलीज तक तय नहीं किया जाएगा): https://connect.microsoft.com/VisualStudio/feedback/details/572138/visual -सी-2010-करता-परमिट-रूपांतरण-का-कैप्चरलेस-लैम्ब्डा-टू-फ़ंक्शन-पॉइंटर –
बस एक एफवाईआई के रूप में: उपरोक्त कोड में से कोई भी इंटेल सी ++ 11.1 –
में समर्थित नहीं है, यह पहले से ही जीसीसीएस बगट्रैक में है, हालांकि अब पुष्टि नहीं हुई: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45080 –