जहां तक मैं समझता हूं, 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