प्रत्येक चर को स्पष्ट रूप से कैप्चर सूची में नाम दिया गया है। डिफ़ॉल्ट कैप्चर केवल वैरिएबल को कैप्चर करेगा जो दोनों हैं (ए) स्पष्ट रूप से कैप्चर सूची में नाम नहीं हैं और (बी) लैम्ब्डा अभिव्यक्ति के शरीर में उपयोग किया जाता है। यदि एक चर को स्पष्ट रूप से नाम नहीं दिया गया है और आप लंबर अभिव्यक्ति में चर का उपयोग नहीं करते हैं, तो चर पर कब्जा नहीं किया गया है। आपके उदाहरण में, my_huge_vector
कैप्चर नहीं किया गया है।
प्रति C ++ 11 C5.1.2 [expr.prim.lambda] / 11:
यदि एक लैम्ब्डा-एक्सप्रेशन में एक संबद्ध कैप्चर-डिफॉल्ट होता है और इसका कंपाउंड-स्टेटमेंट ओआरआर-यूसेज this
या एक वैरिएबल होता है जिसमें ऑटोमैटिक स्टोरेज अवधि होती है और ओआरआर-यूज्ड एंटिटी को स्पष्ट रूप से कैप्चर नहीं किया जाता है, तो ओआरआर-यूज्ड एंटिटी को निहित कैप्चर कहा जाता है।
आपकी लैम्ब्डा अभिव्यक्ति में एक संबद्ध कैप्चर डिफ़ॉल्ट है: डिफ़ॉल्ट रूप से, आप चर का उपयोग करके मूल्य पर कब्जा कर लेते हैं [=]
।
यदि और केवल तभी एक चर का उपयोग किया जाता है (शब्द "प्रयुक्त" के एक परिभाषा नियम अर्थ में) एक चर है जिसे स्पष्ट रूप से कैप्चर किया गया है। चूँकि आप my_huge_vector
लैम्ब्डा अभिव्यक्ति के शरीर ("यौगिक कथन") में बिल्कुल भी उपयोग नहीं करते हैं , यह अंतर्निहित नहीं है।
Continue5.1.2 / 14 के साथ जारी रखने के लिए
एक इकाई को प्रतिलिपि द्वारा कैप्चर किया जाता है यदि
- यह अंतर्निहित रूप से कैप्चर किया गया है और कैप्चर-डिफ़ॉल्ट है
=
या यदि
- यह स्पष्ट रूप से एक कैप्चर के साथ लिया गया है जिसमें ए शामिल नहीं है
&
।
चूँकि आपके my_huge_vector
द्वारा अंतर्निहित रूप से कब्जा नहीं किया गया है और यह स्पष्ट रूप से कब्जा नहीं किया गया है, इसलिए इसे कॉपी या संदर्भ द्वारा बिल्कुल भी कब्जा नहीं किया गया है।