सी 11 में, लैम्ब्डा में वेरिएबल्स को कैप्चर करना आम तौर पर संदर्भ द्वारा किया जाता है। यह संदर्भ तब तक जीवित रहता है जब तक लैम्ब्डा मौजूद है, जो कभी-कभी कैप्चर किए गए वेरिएबल को बाहर ले जाने पर अनपेक्षित व्यवहार का कारण बन सकता है।
सी 14 में, सामान्यीकृत लैम्ब्डा कैप्चर की शुरुआत की गई, जिससे मूव कैप्चर की अनुमति मिल गई। यह अद्वितीय पॉइंटर्स जैसे मूव-ओनली प्रकारों के सुविधाजनक हेरफेर को सक्षम बनाता है।
std::make_unique() .then([u = std::move(u)] { do_something_with(u); });
C 14 से पहले, मूव कैप्चर का उपयोग करके अनुकरण किया जा सकता है सहायक कार्य:
यह दृष्टिकोण एक आवरण बनाता है वर्ग, rref_impl, जो मान को समाहित करता है और उसके जीवनकाल का प्रबंधन करता है।
templateusing rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
हालांकि, लैम्ब्डा में rref को कैप्चर करने से इसे कॉपी किया जा सकता है, जिससे संभावित रूप से रनटाइम त्रुटियां हो सकती हैं।
यह विधि एक का उपयोग करती है फ़ंक्शन जो संदर्भ द्वारा कैप्चर किए गए मान को लेता है और एक लैम्ब्डा लौटाता है जो कैप्चर किए गए मान वाले फ़ंक्शन को तर्क के रूप में कॉल करता है।
templateusing capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward (v); });
यह लैम्ब्डा को कॉपी करने से रोकता है और यह सुनिश्चित करता है कि कैप्चर किया गया मान लैम्ब्डा के दायरे में ले जाया गया है।
याद रखें, ये वर्कअराउंड सी 14 में सामान्यीकृत लैम्ब्डा कैप्चर के समान सुरुचिपूर्ण नहीं हैं, लेकिन वे भाषा के पुराने संस्करणों में मूव कैप्चर का अनुकरण करने का एक तरीका प्रदान करें।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3