2016-01-22 11 views
6

क्या यह टेम्पलेट सीटीओआर सीटीओआर को छुपाता है?क्या सार्वभौमिक संदर्भ के साथ टेम्पलेट कन्स्ट्रक्टर घुमावदार घुमावदार है?

class A { 
    public: 
     template<typename T> 
     A(T &&t); 

     // move would be as this: 
     /* 
      A(A &&a); 
     */ 
}; 

और इस स्थिति में मैं कैसे कदम ctor लागू करना चाहिए? क्या यह डिफ़ॉल्ट वाक्यविन्यास A (A &&) या टेम्पलेट विशेषज्ञता के साथ होना चाहिए?

+1

ऐसा प्रतीत होता है कि जीसीसी में कम से कम, टेम्पलेट सीटीओ को आगे बढ़ते समय नहीं माना जाता है: http://coliru.stacked-crooked.com/a/3c995d34b40fb4bc यदि मानक के अनुसार यह मामला है, तो आप move ctor को कार्यान्वित कर सकते हैं सामान्य तरीका – user2079303

उत्तर

3

मानक के अनुसार (मसौदा)

[class.copy]

3 दसवीं कक्षा के लिए एक गैर टेम्पलेट निर्माता एक चाल निर्माता अगर अपनी पहली पैरामीटर प्रकार एक्स & की है &, स्थिरांक एक्स & &, अस्थिर एक्स & &, या स्थिरांक अस्थिर एक्स & &, और या तो कोई अन्य मापदंडों वरना अन्य सभी बराबर हैं एममीटर के पास डिफ़ॉल्ट तर्क हैं (8.3.6)। [उदाहरण: वाई :: वाई (वाई & &) एक चालक कन्स्ट्रक्टर है।

केवल गैर-टेम्पलेट निर्माता कन्स्ट्रक्टर को स्थानांतरित कर सकते हैं। कॉपी कन्स्ट्रक्टर पर भी लागू होता है। इसलिए निहित चाल कन्स्ट्रक्टर उत्पन्न होता है।

आप सामान्य रूप से चालक को कार्यान्वित करते हैं। विशेषज्ञता काम नहीं करेगी क्योंकि निहित गैर-टेम्पलेट चालक कन्स्ट्रक्टर को ओवरलोड रिज़ॉल्यूशन द्वारा प्राथमिकता दी जाती है।

यदि तर्क प्रकार बिल्कुल const T& से मेल नहीं खाता है, तो टेम्पलेट संदर्भ ओवरलोड रिज़ॉल्यूशन जीतता है। प्रवीण के उदाहरण में देखा जा सकता है कि यह आसानी से हो सकता है।

+1

** कॉपी कन्स्ट्रक्टर ** पर लागू होता है। 'ए 2 {ए 1};' प्रतिलिपि बनाने वाले 'की बजाय' टेम्पलेट 'कॉल करें। क्यूं कर? http://ideone.com/JAfjLy – Praveen

+3

@Praveen क्योंकि 'a1'' const' नहीं है। अग्रेषण संदर्भ वास्तव में लालची हैं। – TartanLlama

5

स्वीकृत उत्तर गलत है। हालांकि यह सच है कि: template <typename T> A(T &&t) { } एक चालक कन्स्ट्रक्टर नहीं है, आप पहले ही उसे जानते थे। संकलक परोक्ष इस मामले और सामान्य अधिभार संकल्प में एक कदम निर्माता घोषणा करेंगे अपेक्षा के अनुरूप काम करेगा:

A a{2}; // calls template 
A b = std::move(a); // calls move 
A c{a}; // calls template 

c में ले जाया जा से a प्रतिबंधित कुछ भी नहीं है, भले ही टेम्पलेट निर्माता एक "चाल" नहीं है निर्माता।

+3

आप कैसे जानते हैं कि पूछताछ जानता है कि टेम्पलेट को चालक कन्स्ट्रक्टर के रूप में नहीं माना जाता है? स्वीकार्य उत्तर में यह कहां कहता है कि कोई चालक कन्स्ट्रक्टर निश्चित रूप से घोषित नहीं किया जाता है? (या _ "स्वीकृत उत्तर गलत है" _ क्या संदर्भित करता है?) – nwp

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