c++ - একটি lambda মধ্যে একটি unique_ptr চলন্ত যখন, রিসেট কল করা সম্ভব নয় কেন?




c++11 unique-ptr (3)

  1. কেন এই ঘটবে?

কারণ lambdas ডিফল্ট অ পরিবর্তনযোগ্য হয়। অতএব সব বন্দী বস্তু const। reset অনন্য পয়েন্টার সংশোধন করে একটি অ-গঠন সদস্য ফাংশন।

  1. Std :: unique_ptr কে অন্য কোন উপায়ে ক্যাপচার করা সম্ভব যা ল্যাম্বার (পুনরায় C ++ 17 বা তার পরে) এর মধ্যে রিসেট () কে কল করার অনুমতি দেয়?

হ্যাঁ। Lambda mutable ঘোষণা করুন:

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

এটি C ++ 11 হতে পারে যেখানে lambdas চালু করা হয়েছিল। একটি নিষ্ক্রিয় Lambda সমস্ত বন্দী অনির্বাচিত বস্তু অ-কন্স কপি হয়।

যখন std::unique_ptr তে std::unique_ptr সরানোর সময়, এটিতে reset() কল করা সম্ভব হয় না, কারণ এটি তখন std::unique_ptr বলে মনে হচ্ছে:

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 অন্য কোন উপায়ে ক্যাপচার করা সম্ভব যা ল্যাম্বারের মধ্যে কলিং reset() std::unique_ptr অনুমতি দেয় (সি ++ 17 বা তার পরে)?

  1. কেন এই ঘটবে?

কারণ একটি lambda ফাংশন কল অপারেটর,

যতক্ষণ না অভিব্যক্তির শব্দটি ল্যাম্বা-এক্সপ্রেশনে ব্যবহৃত হয়, ফাংশন-কল অপারেটরটি সিঙ্ক-যোগ্য এবং কপি দ্বারা প্রাপ্ত বস্তুগুলি এই operator() থেকে অ-পরিবর্তনযোগ্য নয়।

এবং

  1. এটি std::unique_ptr অন্য কোন উপায়ে ক্যাপচার করা সম্ভব যা ল্যাম্বারের মধ্যে reset() কে কল করার অনুমতি দেয়

আপনি এটি mutable চিহ্নিত করতে হবে।

পরিবর্তনযোগ্য: কপি দ্বারা ক্যাপচার করা পরামিতি সংশোধন করতে এবং তাদের অ-সদস্য সদস্য ফাংশন কল করতে পারবেন

যেমন

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

Lambda মধ্যে তার ডেটা সদস্যদের ডিফল্ট দ্বারা অপরিবর্তনীয়। আপনি lambda অভিব্যক্তি থেকে mutable যোগ করতে হবে।

বিকল্প হিসাবে, আপনি রেফারেন্স দ্বারা unique_ptr ক্যাপচার করতে পারেন, উদাহরণস্বরূপ:

#include <memory>

int main()
{
    auto u = std::unique_ptr<int>();
    auto l = [&v = u]{
        v.reset(); 
    };
}






capture-list