क्यों कब्जा कर लिया-दर-मूल्य रहे हैं मान स्थिरांक, लेकिन कब्जा कर लिया-दर-संदर्भ वस्तुओं नहीं:लैम्ब्डा: कैप्चर-बाय-वैल्यू वैल्यू क्यों हैं, लेकिन कैप्चर-बाय-रेफरेंस मान नहीं हैं?
int a;
auto compile_error = [=]()
{
a = 1;
}
auto compiles_ok = [&]()
{
a = 1;
}
मेरे लिए
इस विसंगत लग रहे है, लेकिन यह मानक होने लगते हैं? विशेष रूप से एक कब्जे वाले मूल्य के अवांछित संशोधन एक कष्टप्रद बग हो सकता है, लेकिन संभावना अधिक है कि परिणाम लैम्ब्डा गुंजाइश तक ही सीमित हैं, जबकि संदर्भ द्वारा प्राप्त वस्तुओं की अवांछित संशोधन अक्सर अधिक गंभीर प्रभाव पैदा करेगा।
तो प्रति डिफ़ॉल्ट कॉन्स्ट संदर्भ द्वारा कैप्चर क्यों नहीं करें? या कम से कम समर्थन [const &] और [&]? इस डिजाइन के कारण क्या हैं?
वर्कअराउंड के रूप में आपको शायद मूल्य से कब्जा कर लिया गया std :: cref wrapped const संदर्भों का उपयोग करना चाहिए?
संदर्भ को कैप्चर करने में अधिकांश बिंदु इसे बदल रहा है। मूल्य बदलने के लिए * नहीं * कारण है - यह व्यर्थ है। – Elazar
संदर्भ अपरिवर्तनीय हैं और बाध्य होने के बाद कभी नहीं बदला जा सकता है। तो एक अर्थ में लैम्ब्डा अभिव्यक्तियां बाकी की भाषा के साथ संगत हैं। आप लैम्ब्डा अभिव्यक्तियों के लिए 'म्यूटेबल' का अर्थ जानना चाहेंगे। –
@ एलाजार: अस्थायी के रूप में मूल्य बदला जा सकता है, लेकिन फिर भी जब आप सुझाव देते हैं कि मूल्य बदलने के लिए कोई समस्या नहीं है, जबकि एक संदर्भित वस्तु को बदलना वास्तव में अन्य क्षेत्रों को प्रभावित करता है जो अनजान (बग) हो सकते हैं। – valoh