2015-02-02 7 views
5

में आर और एल मूल्य कंस्ट्रक्टर्स का उपयोग कर मैं इस तरह एक वर्ग टेम्पलेट है। अब जब मैंत्रुटि जब एक टैम्पलेट वर्ग

const A& foo = ...; 
MyClass<const A&> x(foo); 

की तरह कुछ है मैं MyClass(const A & val) के लिए परिभाषा त्रुटि मिलती है।

मुझे लगता है इस वजह से टी & & एक सार्वभौमिक संदर्भ है और नियमों गिर संदर्भ की वजह से, दूसरे निर्माता भी पहले के समान हस्ताक्षर होने में परिवर्तित हो जाता।

सबसे पहले त्रुटि परिदृश्य की मेरी समझ सही है? दूसरी बात यह है कि मैं इस समस्या को कैसे प्राप्त कर सकता हूं (मैं उन अनुकूलन का उपयोग करना चाहता हूं जो MyClass का निर्माण करते समय semantics प्रदान करते हैं)?

उत्तर

6

मुझे लगता है इस वजह से टी & & एक सार्वभौमिक संदर्भ है ...

गलत। T&& इस मामले में एक सार्वभौमिक (अग्रेषण) संदर्भ नहीं है। T&&T के लिए बिल्कुल एक रावल्यू संदर्भ है। सार्वभौमिक/अग्रेषण संदर्भों को कम किया जाना चाहिए।

... और संदर्भ ढहने वाले नियमों के कारण, दूसरा कन्स्ट्रक्टर भी पहले जैसा ही हस्ताक्षर करने के लिए परिवर्तित हो जाता है।

यह सही है। हमारे दो निर्माता लेते हैं:

T const& ==> A const& const& ==> A const& 
T&&  ==> A const& &&  ==> A const& 

इसलिए पुनर्वितरण त्रुटि।

कि यह क्या है आप क्या करना चाहते के आधार पर, एक सरल उपाय हो सकता है करने के लिए सिर्फ std::decayT:

template <typename T> 
class MyClass 
{ 
    using DecT = typename std::decay<T>::type; 

public: 
    MyClass(const DecT&); 
    MyClass(DecT&&); 
}; 

अपने उदाहरण के लिए, कि अभी भी दो कंस्ट्रक्टर्स के साथ एक वर्ग पैदा करेगा: एक const A& और ले जा रही है अन्य A&& ले रहे हैं।

+0

ठीक है, अब मैं समस्या के आसपास कैसे हो सकता हूं? कन्स्ट्रक्टर पर त्याग किए बिना आर-वैल्यू लेता है? – Arun

+0

@ अरुण ने एक दृष्टिकोण लिखा। एक और होगा ... 'MyClass' को एक स्थिर आवेषण के साथ संदर्भ प्रकारों को लेने की अनुमति न दें और कहीं और लागू करें। – Barry

+0

'एक कॉन्स और कॉन्स '' एक कॉन्स और 'है। 'एक कॉन्स & &&' के लिए डिटो। –

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