अद्यतन करें: जैसा कि नीचे बोली में कोर कुर्सी द्वारा वादा किया गया है, अब कोड बीमार है :
यदि एक साधारण-कैप्चर में एक पहचानकर्ता लैम्बडा-घोषणाकर्ता के पैरामीटर-डिक्लेरेशन-क्लॉज के पैरामीटर के डिक्लेरेटर-आईडी के रूप में प्रकट होता है , तो प्रोग्राम बीमार है।
कुछ समय पहले लंबोदर में नाम देखने से संबंधित कुछ समस्याएं थीं। वे N2927 द्वारा हल किए गए थे :
नया शब्द अब कैप्चरिंग संस्थाओं के उपयोगों को हटाने के लिए लुकअप पर निर्भर नहीं करता है। यह अधिक स्पष्ट रूप से व्याख्याओं से इनकार करता है कि एक लैम्ब्डा के कंपाउंड-स्टेटमेंट को दो पास में संसाधित किया जाता है या उस कंपाउंड-स्टेटमेंट में कोई भी नाम क्लोजर प्रकार के सदस्य को हल कर सकता है।
लुकअप हमेशा लैंबडा-एक्सप्रेशन के संदर्भ में किया जाता है , कभी नहीं "के बाद" एक क्लोजर प्रकार के सदस्य फ़ंक्शन बॉडी में परिवर्तन के बाद। देखें [expr.prim.lambda] / 8 :
लैम्ब्डा अभिव्यक्ति के यौगिक बयान पैदावार समारोह शरीर समारोह कॉल ऑपरेटर की ([dcl.fct.def]), लेकिन नाम देखने के प्रयोजनों के लिए, [...], यौगिक बयान के संदर्भ में माना जाता है लैम्ब्डा अभिव्यक्ति । [ उदाहरण :
struct S1 {
int x, y;
int operator()(int);
void f() {
[=]()->int {
return operator()(this->x+y); // equivalent to: S1::operator()(this->x+(*this).y)
// and this has type S1*
};
}
};
- अंतिम उदाहरण ]
(उदाहरण यह भी स्पष्ट करता है कि लुकअप किसी तरह से क्लोजर प्रकार के उत्पन्न कैप्चर सदस्य पर विचार नहीं करता है।)
नाम foo
कैप्चर में घोषित (पुनः) नहीं है; यह लंबोदर अभिव्यक्ति को घेरने वाले ब्लॉक में घोषित किया गया है। पैरामीटर foo
एक ब्लॉक में घोषित किया जाता है जो उस बाहरी ब्लॉक में निहित है (देखें [basic.scope.block] / 2 , जिसमें स्पष्ट रूप से लंबो मापदंडों का भी उल्लेख है)। देखने का क्रम आंतरिक से बाहरी ब्लॉकों तक स्पष्ट रूप से है । इसलिए पैरामीटर का चयन किया जाना चाहिए, अर्थात्, क्लैंग सही है।
यदि आप कैप्चर को इन-कैप्चर बनाना चाहते हैं, तो foo = ""
इसके बजाय foo
, उत्तर स्पष्ट नहीं होगा। ऐसा इसलिए है क्योंकि कब्जा अब वास्तव में एक घोषणा को प्रेरित करता है जिसका "ब्लॉक" नहीं दिया गया है। मैंने इस पर कोर चेयर को मैसेज किया, जिसने जवाब दिया
यह समस्या 2211 है (शीघ्र ही एक नई समस्या सूची खुले-std.org साइट पर दिखाई देगी, दुर्भाग्यवश कई मुद्दों के लिए सिर्फ प्लेसहोल्डर्स के साथ, जिनमें से यह एक है; मैं उन अंतरालों को भरने के लिए कड़ी मेहनत कर रहा हूं पहले Kona महीने के अंत में बैठक)। सीडब्ल्यूजी ने हमारे जनवरी के टेलीकॉन्फ्रेंस के दौरान इस पर चर्चा की, और यह निर्देश प्रोग्राम को बीमार बनाने के लिए है यदि कैप्चर नाम भी एक पैरामीटर नाम है।