2011-10-19 10 views
7

यह प्रश्न भी यूज़नेट को सबमिट किया गया है, जहां यह अधिक उपयुक्त है, लेकिन यह एक बड़ा और अधिक विश्वसनीय मंच है।std :: allocator

std::allocator::construct अपने तर्क पैरामीटर अग्रेषित करने के लिए पैक निर्माण का उपयोग कर कोष्ठक, यानी डायरेक्ट-प्रारंभ आपत्ति उठाने परिभाषित किया गया है।

यदि यह ब्रेसिज़ इस्तेमाल किया, यानी वर्दी आरंभीकरण, हम कुल डेटा प्रकार इस तरह के std::make_shared और container::emplace के रूप में कार्य से प्रारंभ कर सकते हैं। इसके अलावा, यह इस तरह के एक समारोह के तर्क सूची, अग्रेषण के तहत initializer_list प्रकार कटौती की समस्या को हल में एक प्रारंभकर्ता सूची की सामग्री डाल करने के लिए स्वीकार्य होगा।

इस विकल्प माना जाता था और अस्वीकार कर दिया? क्या भविष्य में मानक में स्विच करना बहुत देर हो चुकी है? ऐसा लगता है कि यह एक तोड़ने वाला बदलाव होगा, लेकिन विशेष रूप से जघन्य नहीं है।

+3

स्टैक ओवरफ़्लो _Usenet_ से बड़ा ?! : पी –

+0

@Tomalak: comp.std.C++ और comp.lang.C++ से बड़ा। नियंत्रित, जहां मैंने सबमिट किया। और comp.lang.C++ पागल घर की तुलना में बहुत अधिक स्वीकार्य है, जिसके साथ मैंने परेशान नहीं किया। – Potatoswatter

+0

आपने मेरी स्माइली को याद किया। –

उत्तर

9

मैं क्या अनुसूचित जाति माना जाता पता नहीं है, लेकिन यह है कि वर्दी प्रारंभ नहीं वास्तव में सामान्य संदर्भों (मूल्य निर्माण को छोड़कर *) में 'काम' करता है को ध्यान में रखना। इस प्रयास पर विचार करें:

template<typename T, typename... Args> 
T 
make(Args&&... args) 
{ 
    return T { std::forward<Args>(args)... }; 
} 

आप मिल:

assert(make<std::vector<int>>(10, 0).size() == 2); 
assert(std::vector<int>(10, 0).size() == 10); 

और इस संकलन नहीं करता है:

make<std::vector<int*>>(10u, 0); 

जबकि इस करता है:

std::vector<int*>(10u, 0); 

तो विशेष बातचीत सही अग्रेषण के बीच और प्रारंभकर्ता सूचियां जो इसे जल्द ही औपचारिक रूप से औपचारिक रूप से लागू कर देती हैं, मैं एससी को स्क्रैच से पुनरारंभ करना नहीं चाहता था।

(*): T {} सामान्य संदर्भों में भी ठीक है।

+0

बह, द राइट थिंग का निर्माण। मुझे अभी तक उस तक काटा नहीं गया है। फिर भी एक विकल्प होना अच्छा लगेगा। मानक के लिए 'निर्माण' के तर्कों के लिए 'std :: is_constructible :: value'' true' होना आवश्यक है; यूबी की छतरी के नीचे एक कार्यान्वयन द्वारा प्रदान की गई प्रत्यक्ष शुरुआत एक फॉलबैक हो सकती है। – Potatoswatter

+0

@Potatoswatt के बाद से है कि विशेषता 'TRUE' वापसी होगी iff प्रकार प्रत्यक्ष प्रारंभ का उपयोग कर constructible है, मुझे लगता है कि आप का मतलब है कि वापस आने वर्दी प्रारंभ हो। एक दिलचस्प विचार, जो मौजूदा नियमों के साथ पिछड़ा संगत है। –

+0

हां, ज़ाहिर है: वीपी – Potatoswatter