2010-07-01 5 views
9

मैंने कहीं पढ़ा है कि कैप्चर सूची खाली होने पर एक लैम्ब्डा फ़ंक्शन पॉइंटर को कार्य करने का क्षय होना चाहिए। केवल एक ही संदर्भ जो मैं पा सकता हूं वह n3052 है। जी ++ के साथ (4.5 & 4.6) यह अपेक्षा के अनुसार काम करता है, जब तक कि लैम्ब्डा टेम्पलेट कोड के भीतर घोषित नहीं किया जाता है।क्या लैम्ब्डा क्षय टेम्पलेट कोड में पॉइंटर को कार्य करने के लिए चाहिए?

उदाहरण के लिए निम्न कोड को संकलित करता है:

void foo() { 
    void (*f)(void) = []{}; 
} 

लेकिन यह अब और जब टेम्प्लेट संकलन नहीं करता है (अगर foo वास्तव में कहीं भी कहा जाता है):

template<class T> 
void foo() { 
    void (*f)(void) = []{}; 
} 

संदर्भ में ऊपर, मैं डॉन इस व्यवहार की व्याख्या नहीं देखते हैं। क्या यह g ++ की अस्थायी सीमा है, और यदि नहीं, तो क्या यह (तकनीकी) कारण है कि इसे अनुमति न दें?

+1

ध्यान दें कि आपके द्वारा उद्धृत एन 3052, वास्तव में सी ++ 0x एफसीडी (एन 30 9 2 5.1.2/6) में शामिल किया गया था। विज़ुअल सी ++ 2010 रूपांतरण को कार्यान्वित नहीं करता है (असुरक्षित, क्योंकि वीसी ++ जारी होने से पहले इसे अनुमति देने वाली भाषा को मानक में शामिल किया गया था)। मैंने माइक्रोसॉफ्ट कनेक्ट पर एक बग रिपोर्ट सबमिट की है (हालांकि मुझे उम्मीद है कि इसे विजुअल सी ++ की अगली रिलीज तक तय नहीं किया जाएगा): https://connect.microsoft.com/VisualStudio/feedback/details/572138/visual -सी-2010-करता-परमिट-रूपांतरण-का-कैप्चरलेस-लैम्ब्डा-टू-फ़ंक्शन-पॉइंटर –

+0

बस एक एफवाईआई के रूप में: उपरोक्त कोड में से कोई भी इंटेल सी ++ 11.1 –

+1

में समर्थित नहीं है, यह पहले से ही जीसीसीएस बगट्रैक में है, हालांकि अब पुष्टि नहीं हुई: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45080 –

उत्तर

3

मैं इस बात का कोई कारण नहीं सोच सकता कि इसे विशेष रूप से अस्वीकार कर दिया जाएगा। मुझे लगता है कि यह जी ++ की अस्थायी सीमा है।

मैं भी कुछ अन्य बातें करने की कोशिश की:

template <class T> 
void foo(void (*f)(void)) {} 

foo<int>([]{}); 

काम करता है।

typedef void (*fun)(void); 

template <class T> 
fun foo() { return []{}; } // error: Cannot convert. 

foo<int>()(); 

यही नहीं करता है (लेकिन करता है, तो foo पैरामिट्रीकृत नहीं है)।

नोट: मैंने केवल जी ++ 4.5 में परीक्षण किया है।

+0

हां, पहले मामले में लैम्बडा को कोड के एक गैर-टेम्पलेट हिस्से में घोषित किया गया है (हालांकि इसे टेम्पलेट फ़ंक्शन द्वारा उपयोग किया जाता है) । एक ही समस्या तब होती है जब लैम्ब्डा को टेम्पलेट वर्ग के अंदर घोषित किया जाता है। – rafak

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