2016-01-13 6 views
75

मैं जानना चाहता हूं कि [=] क्या करता है? यहाँ एक छोटी उदाहरणसी ++ - [=] क्या करता है?

template <typename T> 
std::function<T (T)> makeConverter(T factor, T offset) { 
    return [=] (T input) -> T { return (offset + input) * factor; }; 
} 

auto milesToKm = makeConverter(1.60936, 0.0); 

है कैसे [] बजाय [=] साथ कोड काम करेंगे?

std::function<T (T)> 

एक समारोह प्रोटोटाइप जो तर्क और वापसी प्रकार T रूप (T) हो जाता है इसका मतलब है?

+0

यह विचित्र रूप से अत्यधिक ऐसा वोट दिया जाता है जो 3 अलग-अलग अनचाहे प्रश्न पूछता है और यह एक डुप्लिकेट है [सी ++ 11 में लैम्ब्डा अभिव्यक्ति क्या है?] (Https://stackoverflow.com/questions/7627098/what -इस-ए-लैम्ब्डा-अभिव्यक्ति-इन-सी 11) –

उत्तर

96

[=] आप लैम्बडा अभिव्यक्ति के लिए कैप्चर सूची का हिस्सा हैं। यह सी ++ को बताता है कि लैम्ब्डा अभिव्यक्ति के अंदर कोड प्रारंभ किया गया है ताकि लैम्ब्डा को बनाए गए सभी स्थानीय चरों की एक प्रति प्राप्त हो। लैम्ब्डा अभिव्यक्ति के लिए factor और offset का संदर्भ देने में सक्षम होना आवश्यक है, जो फ़ंक्शन के अंदर स्थानीय चर हैं।

आप [=][] के साथ बदलें, तो आप एक संकलक त्रुटि मिलती है क्योंकि लैम्ब्डा अभिव्यक्ति के अंदर कोड क्या चर offset और factor का उल्लेख नहीं जान जाएगा। यदि आप ऐसा करते हैं तो कई कंपाइलर्स अच्छे डायग्नोस्टिक त्रुटि संदेश देते हैं, इसलिए इसे आज़माएं और देखें कि क्या होता है!

+12

"यह आवश्यक है" - यह सटीक विकल्प आवश्यक नहीं है; हम '[&] ',' [= ऑफसेट, = इनपुट]', आदि भी लिख सकते हैं –

+1

@ एमएम - क्या यह स्थानीय लोगों के संदर्भों को कैप्चर नहीं करता है? – Useless

+5

@ एमएम। यहां एक संदर्भ कैप्चर का उपयोग करना एक समस्या होगी क्योंकि लैम्बडा लौटने के बाद उन स्थानीय चर के जीवनकाल समाप्त हो जाएंगे। आप सही हैं कि हम व्यक्तिगत रूप से अलग-अलग चर सूचीबद्ध कर सकते हैं। – templatetypedef

33

यह lambda कैप्चर सूची है। लैम्ब्डा के लिए उपलब्ध चर बनाता है। आप [=] का उपयोग कर सकते हैं जो मूल्य से प्रतियां, या [&] जो संदर्भ द्वारा गुजरता है।

+2

आप '[]' का भी उपयोग कर सकते हैं जो कुछ भी कैप्चर नहीं करता है। :) –

+0

हाँ, सच है। :-) – kometen

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