जहां तक मैं समझता हूं, C ++ 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मानक पुस्तकालय से हटाने के पक्ष में वकालत नहीं कर रहा हूं (इसे कम से कम पिछड़े अनुकूलता के लिए समझ में आता है), लेकिन यह सोचकर कि क्या अभी भी ऐसी परिस्थितियां हैं जिनमें इसे दृढ़ता से पसंद किया जाता हैstd::unique_ptr
std::make_uniqueपहली जगह में नहीं था , तो मुझे नहीं लगता कि एसटीएल में इसे जोड़ने के लिए पर्याप्त कारण होगा, खासकर जब यह एक सिंटैक्स है जो कंस्ट्रक्टर का उपयोग करने की तुलना में कम अभिव्यंजक है, अधिक नहीं
std::unique_ptr? इसके खिलाफ कोई तर्क नहीं हैmake_unique