निम्नलिखित कोड को देखते हुए, क्या फ़ू को प्रतिलिपि बनाने वाला है? एसटीएल कंटेनरों के साथ फू का उपयोग करना सुरक्षित है?टेम्पलेट कॉपी कन्स्ट्रक्टर
class Foo
{
public:
Foo() {}
template <typename T>
Foo(const T&) {}
};
निम्नलिखित कोड को देखते हुए, क्या फ़ू को प्रतिलिपि बनाने वाला है? एसटीएल कंटेनरों के साथ फू का उपयोग करना सुरक्षित है?टेम्पलेट कॉपी कन्स्ट्रक्टर
class Foo
{
public:
Foo() {}
template <typename T>
Foo(const T&) {}
};
मानक स्पष्ट रूप से कहा गया है कि एक प्रति निर्माता एक गैर टेम्प्लेटेड निर्माता है कि एक ही प्रकार के एक संभवतः स्थिरांक-वाष्पशील ऑब्जेक्ट के संदर्भ लेता है। आप उपरोक्त कोड में एक रूपांतरण नहीं बल्कि प्रतिलिपि निर्माता है (यानी यह सब कुछ के लिए उपयोग किया जाएगा लेकिन प्रतियां, जहां परोक्ष घोषित निर्माता का उपयोग किया जाएगा)।
क्या
Foo
में एक प्रतिलिपि है?
हां, निहित घोषित/परिभाषित प्रतिलिपि निर्माता।
क्या मानक पुस्तकालय कंटेनर के साथ
Foo
का उपयोग करना सुरक्षित है?
Foo
की वर्तमान परिभाषा यह है के साथ
, लेकिन सामान्य मामले में, यह क्या सदस्यों Foo
है और क्या परोक्ष परिभाषित प्रतिलिपि निर्माता सही ढंग से उन का प्रबंधन करता है निर्भर करता है।
Foo
में एक कंपाइलर जेनरेट कॉपी कन्स्ट्रक्टर है, जिसे आपके द्वारा प्रदान किए गए टेम्पलेट रूपांतरण निर्माता द्वारा प्रतिस्थापित नहीं किया जा सकता है।
Foo f0;
Foo f1(f0); // calls compiler-synthesized copy constructor
Foo f2(42); // calls template conversion constructor with T=int
ऐसा लगता है कि वास्तव में कॉपी कन्स्ट्रक्टर को कॉल नहीं करना है। Http : //stackoverflow.com/questions/11037644/how-do-i-get-the-copy-constructor-called-over-a-variadic-constructor –
स्टैंडर्ड के अनुसार, एक कॉपी-निर्माता निम्नलिखित हस्ताक्षर से एक होना चाहिए:
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 है।
और इसमें डिफ़ॉल्ट पैरामीटर भी हो सकते हैं – FrozenHeart
@NikitaTrophimov: हाँ, वह भी। – Nawaz
क्या होता है यदि यह टेम्पलेट 'Foo (const Foo &) = delete; से पहले घोषित किया गया है? क्या कक्षा में अब कोई कॉपी कन्स्ट्रक्टर नहीं है या टेम्पलेट को इसके बजाए बुलाया जाता है? – orlp
यदि कॉपी कन्स्ट्रक्टर हटा दिया गया है, तो कक्षा में कोई नहीं है। ;-) –
@nightcracker तब कोई कॉपी कन्स्ट्रक्टर नहीं है और संकलक एक त्रुटि देता है (जब तक कि आपके पास कोई अभिव्यक्ति न हो, उदाहरण के लिए चाल प्रतिलिपि का उपयोग किया जा सकता था)। कुंजी यह है कि कॉपी कन्स्ट्रक्टर * गैर-टेम्पलेट * है। – juanchopanza