c++ - जब एक लैम्ब्डा में unique_ptr ले रहा है, तो रीसेट को कॉल करना क्यों संभव नहीं है?




c++11 lambda (3)

  1. क्यों होता है ऐसा?

क्योंकि एक lambda के फ़ंक्शन-कॉल ऑपरेटर,

जब तक कि लैम्बडा-एक्सप्रेशन में कीवर्ड mutable का उपयोग नहीं किया गया था, फंक्शन-कॉल ऑपरेटर कांस्ट-योग्य है और कॉपी द्वारा कैप्चर की गई वस्तुएँ इस operator() अंदर से गैर-परिवर्तनीय हैं।

तथा

  1. क्या std::unique_ptr पर कब्जा करना संभव है std::unique_ptr दूसरे तरीके से जो std::unique_ptr भीतर reset() कॉल reset() अनुमति देता है

आपको इसे mutable करने की आवश्यकता है।

उत्परिवर्तनीय: शरीर को प्रतिलिपि द्वारा कैप्चर किए गए मापदंडों को संशोधित करने की अनुमति देता है, और उनके गैर-सदस्य सदस्य कार्यों को कॉल करने के लिए

जैसे

auto l = [v = std::move(u)]() mutable {
    v.reset();
};

जब std::unique_ptr को लैम्ब्डा में ले जाते हैं, तो उस पर reset() कॉल करना संभव नहीं है, क्योंकि यह तब लगता है:

error C2662: void std::unique_ptr<int,std::default_delete<_Ty>>::reset(int *) noexcept': cannot convert 'this' pointer from 'const std::unique_ptr<int,std::default_delete<_Ty>>' to 'std::unique_ptr<int,std::default_delete<_Ty>> &
#include <memory>
int main()
{
    auto u = std::unique_ptr<int>();
    auto l = [v = std::move(u)]{
        v.reset(); // this doesn't compile
    };
}
  1. क्यों होता है ऐसा?
  2. क्या std::unique_ptr पर कब्जा करना संभव है std::unique_ptr दूसरे तरीके से जो कॉलिंग reset() लैम्ब्डा के भीतर (C ++ 17 या उसके बाद) की अनुमति देता है?

  1. क्यों होता है ऐसा?

क्योंकि लंबोदर डिफ़ॉल्ट रूप से गैर-परस्पर हैं। इसलिए सभी कैप्चर की गई चीजें कॉन्स्टेबल हैं। reset एक नॉन-कास्ट सदस्य फ़ंक्शन है जो अद्वितीय पॉइंटर को संशोधित करता है।

  1. क्या std पर कब्जा करना संभव है :: unique_ptr दूसरे तरीके से जो लैम्बडा के भीतर रीसेट () को कॉल करने की अनुमति देता है (C ++ 17 या उसके बाद)?

हाँ। लैम्बडा म्यूटेबल घोषित करें:

[captures](arguments) mutable { body }
                      ^^^^^^^

यह C ++ 11 के बाद से संभव है जहां लैम्ब्डा को पेश किया गया था। एक उत्परिवर्तित लैम्ब्डा की सभी गैर-नॉन-कास्ट ऑब्जेक्ट गैर-कॉस्ट प्रतियां हैं।


लैम्ब्डा के "सदस्य" को म्यूट करने के लिए, आपको mutable कीवर्ड की आवश्यकता है:

auto l = [v = std::move(u)] () mutable {
    v.reset();
};






capture-list