Should I use() or {} when forwarding arguments? देखें। foo
एक std::vector
क्लोन है।std :: make_unique et al के लिए std :: startizer_list ओवरलोड मौजूद क्यों नहीं हैं?
N4140 में, unique.ptr.createstd::make_unique
इतनी के रूप में निर्दिष्ट किया जाता है:
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);
टिप्पणियां: इस समारोह अधिभार संकल्प में भाग नहीं होगा जब तक कि
T
एक सरणी नहीं है।पर लौटें:
unique_ptr<T>(new T(std::forward<Args>(args)...))
।
कार्यान्वयन इसका मतलब है कि ()
बजाय {}
उपयोग करने के लिए वस्तुओं प्रारंभ करने की आवश्यकता है। उदाहरण के लिए,
auto s1 = std::make_unique<foo>(3, 1).get()->size();
auto s2 = std::make_unique<foo>(1).get()->size();
auto s3 = std::make_unique<foo>(2).get()->size();
std::cout << s1 << s2 << s3;
आउटपुट 312
उत्पादन जबकि अगर {}
(std::make_unique
अंदर) इस्तेमाल किया गया था 211
होगा निम्नलिखित। चूंकि प्रारंभिक सूची को घटाया नहीं जा सकता है, इसलिए बाद के परिणाम प्राप्त करने के लिए std::initializer_list
स्पष्ट रूप से पारित किया जाना चाहिए। सवाल यह है कि, इस तरह एक अधिभार क्यों नहीं है?
namespace test
{
template <class T, class Deduce>
std::unique_ptr<T> make_unique(std::initializer_list<Deduce> li)
{
return ::std::make_unique<T>(li);
}
};
int main()
{
auto p1 = test::make_unique<foo>({3, 1}).get()->size();
auto p2 = test::make_unique<foo>({1}).get()->size();
auto p3 = test::make_unique<foo>({2}).get()->size();
std::cout << p1 << p2 << p3;
}
आउटपुट 211
।
मैं बहुत अच्छे कारण होने के कारण "आप इसे स्वयं लिख सकते हैं" या "मानक को फलने से रोकने के लिए" कारणों पर विचार नहीं करते हैं। क्या इस अधिभार को प्रदान करने के लिए कोई नुकसान है?
मुझे नहीं लगता कि SFINAE आवश्यक है है। 'make_unique> (1, 73); 'अगर मैं इसे नामस्थान से बाहर ले जाता हूं और नामस्थान स्टेड का उपयोग कर रहा हूं, तो' पूरी तरह से ठीक काम करता है '(यह सुनिश्चित करने के लिए कि दोनों अधिभार दिखाई दे रहे हैं)। अगर कोई 'make_unique > ({1, 73}) करता है;' यह उनकी गलती है। –
user6319825
@ user6319825।हां, एसएफआईएनएई आवश्यक नहीं है, संकलन किसी भी तरह से विफल रहता है, बस मेरे अनुभव में एक SFINAE पर्यावरण में त्रुटि संदेश निदान करने के लिए "आसान" हैं। – Niall
फिर भी। उन्होंने जानबूझकर कहा कि 'नया टी (std :: आगे (तर्क) ...)' इसे वैकल्पिक रूप से [वैकल्पिक] (http://eel.is/c++draft/optional.object) के कार्यान्वयन के लिए छोड़ने के बजाय .ctor # 23): "निहित मूल्य को आरंभ करता है जैसे डायरेक्ट-गैर-सूची- तर्क 'टी'' के ऑब्जेक्ट को प्रारंभ करने के लिए 'st' :: आगे (तर्क)' ...." इससे मुझे लगता है कि वहां है विशेष रूप से 'make_unique' के लिए कुछ चर्चा * कहीं *। –
user6319825