নেই সি ++ 11 মান গ্রন্থাগার A থেকে রূপান্তর করতে কোন উপযোগ প্রদান std::shared_ptrকরতে std::unique_ptr, অথবা বিপরীতভাবে ভাইস? এই নিরাপদ অপারেশন?
shared_ptr।
নেই সি ++ 11 মান গ্রন্থাগার A থেকে রূপান্তর করতে কোন উপযোগ প্রদান std::shared_ptrকরতে std::unique_ptr, অথবা বিপরীতভাবে ভাইস? এই নিরাপদ অপারেশন?
shared_ptr।
উত্তর:
std::unique_ptrএকচেটিয়া মালিকানা প্রকাশের সি ++ 11 উপায়, তবে এর অন্যতম আকর্ষণীয় বৈশিষ্ট্য হ'ল এটি সহজে এবং দক্ষতার সাথে একটিতে রূপান্তরিত হয়std::shared_ptr।এটি
std::unique_ptrকারখানার ফাংশন রিটার্ন টাইপের মতো কেন এত উপযুক্ত। কারখানার ফাংশনগুলি জানতে পারে না যে কলাররা তাদের ফিরে আসা অবজেক্টের জন্য একচেটিয়া মালিকানা শব্দার্থ ব্যবহার করতে চাইবে বা ভাগ করে নেওয়া মালিকানা (যেমন,std::shared_ptr) আরও উপযুক্ত হবে কিনা । ফিরিয়ে দেওয়ার মাধ্যমেstd::unique_ptr, কলকারখানা কলকারীদেরকে সবচেয়ে দক্ষ স্মার্ট পয়েন্টার সরবরাহ করে, তবে কলারদের এটি আরও নমনীয় ভাইবিলের সাথে প্রতিস্থাপন করতে বাধা দেয় না।
std::shared_ptrকরারstd::unique_ptrঅনুমতি নেই। একবার আপনি কোনও উত্সের আজীবন পরিচালনাকে একটিতে পরিণত করার পরেstd::shared_ptr, আপনার মন পরিবর্তন হয় না। এমনকি যদি রেফারেন্স গণনা এক হয় তবে আপনিstd::unique_ptrএটি পরিচালনা করতে, বলতে, আপনি উত্সটির মালিকানা দাবি করতে পারবেন না ।তথ্যসূত্র: কার্যকর আধুনিক সি ++। আপনার সি ++ 11 এবং সি ++ 14 এর ব্যবহার উন্নত করার জন্য বিশেষ উপায়। স্কট মায়ার্স
সংক্ষেপে বলতে গেলে, আপনি সহজেই এবং দক্ষতার একটি রূপান্তর করতে পারেন std::unique_ptrকরার std::shared_ptrকিন্তু আপনি রূপান্তর করতে পারবেন না std::shared_ptrকরার std::unique_ptr।
উদাহরণ স্বরূপ:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
বা:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptrএকটি থেকে std::shared_ptr।
std::unique_ptrএকটি মধ্যে std::shared_ptr? স্ট্যান্ডার্ড লাইব্রেরি একটি মুভ অ্যাসাইনমেন্ট অপারেটরের template<class Y, class Deleter> shared_ptr& operator=(std::unique_ptr<Y, Deleter>&& r); জন্য সংজ্ঞা দেয় std::shared_ptr<T>।
ইউনিক_সিপিআর_আপনার দেওয়া হয়েছে, শেয়ারড_পিটার এস_পিটিআর তৈরি করুন:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
অন্য পথে যাওয়া অবৈধ।
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleterভিতরে থাকা unique_ptr