আমি যতদূর বুঝতে পেরেছি, সি ++ 14 চালু করেছে std::make_unique
কারণ, প্যারামিটারের মূল্যায়ন আদেশ নির্দিষ্ট না করার ফলে এটি অনিরাপদ ছিল:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(ব্যাখ্যা: যদি মূল্যায়ন প্রথমে কাঁচা পয়েন্টারটির জন্য মেমরির বরাদ্দ দেয়, তবে কল করার পরে g()
কোনও ব্যতিক্রম std::unique_ptr
নির্মাণের আগে নিক্ষেপ করা হয় , তবে স্মৃতিটি ফাঁস হয়))
কল std::make_unique
করা কল অর্ডারকে সীমাবদ্ধ করার উপায় ছিল, সুতরাং জিনিসগুলি নিরাপদ করে তুলেছিল:
f(std::make_unique<MyClass>(param), g()); // Syntax B
তারপর থেকে, সি ++ 17 মূল্যায়ন অর্ডার বিষয়টিকে ব্যাখ্যা করেছে, খুব সিনট্যাক্স একটি নিরাপদ করা, তাই এখানে আমার প্রশ্ন হল: এখনও ব্যবহার করার জন্য একটি কারণ নেই std::make_unique
ওভারstd::unique_ptr
সি ++ 17 কন্সট্রাকটর কইলাম? আপনি কিছু উদাহরণ দিতে পারেন?
এখন পর্যন্ত, আমি কল্পনা করতে পারি তার একমাত্র কারণ এটি MyClass
কেবল একবার টাইপ করতে দেয় (ধরে নিলে আপনার বহুবর্ষের উপর নির্ভর করার দরকার নেই std::unique_ptr<Base>(new Derived(param))
)। তবে এটি বেশ দুর্বল কারণে বলে মনে হচ্ছে, বিশেষত যখন std::make_unique
কনস্ট্রাক্টর যখন কোনও মুছে ফেলা নির্দিষ্ট করতে দেয় std::unique_ptr
না।
এবং কেবল পরিষ্কারভাবেই বলা যায়, আমি std::make_unique
স্ট্যান্ডার্ড লাইব্রেরি থেকে সরিয়ে নেওয়ার পক্ষে সমর্থন দিচ্ছি না (এটি অন্তত পশ্চাদপদ সামঞ্জস্যের জন্য উপলব্ধি করে), তবে ভাবছেন যে এখনও এমন পরিস্থিতি রয়েছে যেখানে এটির চেয়ে দৃ strongly়ভাবে অগ্রাধিকার দেওয়া হয়েছে?std::unique_ptr
std::unique_ptr
? এটি বিরুদ্ধে কোন যুক্তি নয়make_unique