2017-09-21 5 views
9
vector<int> vec; 

//a 
auto foo = [&vec](){ 
    //do something 
}; 

//b 
auto foo = [&v = vec](){ 
    //do something 
}; 

क्या मैं इसे सही समझता हूं कि ए और बी के बीच केवल अंतर बी मामले में "वीसी" के लिए उपनाम "v" का निर्माण है या इसके लिए और भी कुछ है?लैम्बडास में [और कब्जा कर लिया] और [और स्थानीय = कब्जा] द्वारा कैप्चरिंग के बीच क्या अंतर हैं?

+0

उस [यहां] के बारे में अधिक जानकारी (है http://en.cppreference.com/w/cpp/language/lambda#Lambda_capture: हालांकि, अगर आप मान द्वारा कब्जा करने के लिए थे वहाँ एक अंतर हो जाएगा) लेकिन प्रासंगिक स्निपेट * "प्रारंभकर्ता के साथ एक कैप्चर करता है जैसे कि यह घोषित करता है और स्पष्ट रूप से प्रकार ऑटो के साथ घोषित एक चर को कैप्चर करता है, जिसका घोषित क्षेत्र लैम्ब्डा अभिव्यक्ति का शरीर है ..." * – CoryKramer

उत्तर

5

मूल रूप से कोई नहीं है। यह आपको वहां पर कब्जा मूल्य एक कस्टम नाम देने की अनुमति देने के लिए है।

नोट तथापि है कि इस वाक्य रचना (init कब्जा कहा जाता है) की आवश्यकता होती है जब आप वास्तव में बंद में एक वस्तु को स्थानांतरित करना चाहते हैं:

std::vector<int> vector; 
auto lambda = [vec = std::move(vector)]() { /* the lambda owns the vector now */ }); 
+5

यह एक रैल्यू नहीं पकड़ता है संदर्भ। यह एक Rvalue संदर्भ का उपयोग कर एक मूल्य पर कब्जा। –

+0

यह तकनीकी रूप से सही है। मैंने जवाब साफ़ कर दिया। – Jodocus

+1

मुझे यकीन नहीं है कि यह कोई बेहतर है। "संदर्भ द्वारा कैप्चर" का अर्थ '[& vec_ref = vec_orig] 'के लिए लिया जाता है, इसलिए लोगों को एक लैम्ब्डा कैप्चर वैरिएबल बनाने के लिए" रावल्यू रेफरेंस द्वारा कैप्चर "की उम्मीद होगी जो कि खुद ही एक रावल्यू संदर्भ है, लेकिन फिर, जो आप वास्तव में बनाते हैं वह एक मूल्य है । यह आरएचएस को एक रावल्यू संदर्भ में कास्ट करके अपने चालक कन्स्ट्रक्टर का उपयोग करने के लिए होता है। –

11

इस मामले में कोई वास्तविक अंतर है।

const std::vector<int> vec; // note const 

auto foo = [vec]() mutable { 
    // can't change vec here since it is captured with cv-qualifiers 
}; 

auto bar = [v = vec]() mutable { 
    // can change v here since it is captured by auto deduction rules 
    // (cv-qualifiers dropped) 
}; 
संबंधित मुद्दे