আপনি সি ++ অবহিত (বিশেষভাবে প্রয়োজন std::vector
) যে আপনার পদক্ষেপ কন্সট্রাকটর এবং বিনাশকারী ব্যবহার করে, নিক্ষেপ না noexcept
। তারপরে ভেক্টর বড় হওয়ার সাথে সাথে মুভ কনস্ট্রাক্টরকে ডাকা হবে।
এইভাবে সম্মতিযুক্ত একটি মুভি কনডাক্টরকে ঘোষণা এবং প্রয়োগ করতে হয় std::vector
:
A(A && rhs) noexcept {
std::cout << "i am the move constr" <<std::endl;
... some code doing the move ...
m_value=std::move(rhs.m_value) ;
}
যদি কনস্ট্রাক্টর না হয় noexcept
,std::vector
এটা ব্যবহার করতে পারবেন না, যেহেতু তারপর, এটা মান দ্বারা দাবি ব্যতিক্রম গ্যারান্টী নিশ্চিত করতে পারবে না।
স্ট্যান্ডার্ডে কী বলা হয়েছে সে সম্পর্কে আরও তথ্যের জন্য,
সি ++ সরান শব্দার্থবিজ্ঞান এবং ব্যতিক্রমগুলি পড়ুন
বো এর কাছে ক্রেডিট যিনি ইঙ্গিত দিয়েছিলেন যে এটি ব্যতিক্রমগুলি সহ করতে পারে। কেরেক এসবির পরামর্শ বিবেচনা করুন এবং emplace_back
সম্ভব হলে ব্যবহার করুন । এটা তোলে করতে দ্রুত (কিন্তু প্রায়ই নয়), এটা পরিষ্কার এবং আরো কম্প্যাক্ট হতে পারে, কিন্তু এছাড়াও আছে কিছু ফাঁদ (বিশেষ করে অ স্পষ্ট কনস্ট্রাকটর সঙ্গে) হয়।
সম্পাদনা করুন , প্রায়শই ডিফল্ট আপনি যা চান তা হ'ল: সরানো যায় এমন সমস্ত কিছু সরিয়ে দিন, বাকীটি অনুলিপি করুন। স্পষ্টভাবে এর জন্য জিজ্ঞাসা করতে, লিখুন
A(A && rhs) = default;
এটি করে আপনি যখন সম্ভব সম্ভব নন: ডিফল্ট মুভ কনস্ট্রাক্টরকে নোসেপ্ট হিসাবে সংজ্ঞায়িত করা হয় কি?
নোট করুন যে ভিজ্যুয়াল স্টুডিও 2015 এর প্রাথমিক সংস্করণগুলি এর পুরানো সংস্করণগুলিকে সমর্থন করলেও এটি সমর্থন করে না।