2012-09-11 17 views

उत्तर

10

मानक स्पष्ट रूप से कहा गया है कि एक प्रति निर्माता एक गैर टेम्प्लेटेड निर्माता है कि एक ही प्रकार के एक संभवतः स्थिरांक-वाष्पशील ऑब्जेक्ट के संदर्भ लेता है। आप उपरोक्त कोड में एक रूपांतरण नहीं बल्कि प्रतिलिपि निर्माता है (यानी यह सब कुछ के लिए उपयोग किया जाएगा लेकिन प्रतियां, जहां परोक्ष घोषित निर्माता का उपयोग किया जाएगा)।

क्या Foo में एक प्रतिलिपि है?

हां, निहित घोषित/परिभाषित प्रतिलिपि निर्माता।

क्या मानक पुस्तकालय कंटेनर के साथ Foo का उपयोग करना सुरक्षित है?

Foo की वर्तमान परिभाषा यह है के साथ

, लेकिन सामान्य मामले में, यह क्या सदस्यों Foo है और क्या परोक्ष परिभाषित प्रतिलिपि निर्माता सही ढंग से उन का प्रबंधन करता है निर्भर करता है।

+0

क्या होता है यदि यह टेम्पलेट 'Foo (const Foo &) = delete; से पहले घोषित किया गया है? क्या कक्षा में अब कोई कॉपी कन्स्ट्रक्टर नहीं है या टेम्पलेट को इसके बजाए बुलाया जाता है? – orlp

+1

यदि कॉपी कन्स्ट्रक्टर हटा दिया गया है, तो कक्षा में कोई नहीं है। ;-) –

+0

@nightcracker तब कोई कॉपी कन्स्ट्रक्टर नहीं है और संकलक एक त्रुटि देता है (जब तक कि आपके पास कोई अभिव्यक्ति न हो, उदाहरण के लिए चाल प्रतिलिपि का उपयोग किया जा सकता था)। कुंजी यह है कि कॉपी कन्स्ट्रक्टर * गैर-टेम्पलेट * है। – juanchopanza

1

Foo में एक कंपाइलर जेनरेट कॉपी कन्स्ट्रक्टर है, जिसे आपके द्वारा प्रदान किए गए टेम्पलेट रूपांतरण निर्माता द्वारा प्रतिस्थापित नहीं किया जा सकता है।

Foo f0; 
Foo f1(f0); // calls compiler-synthesized copy constructor 
Foo f2(42); // calls template conversion constructor with T=int 
+0

ऐसा लगता है कि वास्तव में कॉपी कन्स्ट्रक्टर को कॉल नहीं करना है। Http : //stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –

4

स्टैंडर्ड के अनुसार, एक कॉपी-निर्माता निम्नलिखित हस्ताक्षर से एक होना चाहिए:

Foo(Foo &); 
Foo(Foo const &); 
Foo(Foo volatile &); 
Foo(Foo const volatile &); 

Foo(Foo&, int = 0,); 
Foo(Foo&, int = 0, float = 1.0); //i.e the rest (after first) of the 
           //parameter(s) must have default values! 

के बाद से अपने कोड में टेम्पलेट निर्माता उपरोक्त में से किसी का फार्म के साथ मेल नहीं खाता , कॉपी -constructor है।

+1

और इसमें डिफ़ॉल्ट पैरामीटर भी हो सकते हैं – FrozenHeart

+0

@NikitaTrophimov: हाँ, वह भी। – Nawaz

संबंधित मुद्दे