2013-06-06 14 views
10

अत्यधिक अस्पष्ट शीर्षक के लिए खेद है। (मेरे अंग्रेजी कौशल की कमी के कारण)। कृपया एक बेहतर शीर्षक का सुझाव दें।क्यों कॉपी कन्स्ट्रक्टर का आह्वान नहीं किया जाता है?

कृपया निम्नलिखित कोड पर विचार करें।

struct A { 
    typedef std::vector<double> State; 

    // template <class... Args> 
    // A(Args... args) 
    //  : a(args...) 
    // {} 

    template <class... Args> 
    A(Args&&... args) 
      : a(std::forward<Args>(args)...) 
    {} 

    A(const A&) = default; 
    A(A&&) = default; 

    State a; 
}; 

int main(){ 

    A a(3,2); 
    A b = a; // This line triggers an error!! 
} 

जीसीसी 4.8.0 त्रुटि संदेश error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...) साथ यह संकलन करने में विफल रहा है।

मुझे समझ में नहीं आता कि यह कोड गलत क्यों है। मेरी राय में, संकलक को A b = a; लाइन में कॉपी कन्स्ट्रक्टर का आह्वान करना चाहिए।

हालांकि अगर मैं कन्स्ट्रक्टर को टिप्पणी के द्वारा प्रतिस्थापित करता हूं (जो केवल मूल्य लेता है)। यह संकलित करता है। इसके अलावा, अब डिफ़ॉल्ट प्रतिलिपि (और चाल) कन्स्ट्रक्टर के लिए लाइनों की आवश्यकता नहीं है। यहां क्या होता है?

उत्तर

9

संकलक स्वचालित रूप से टेम्पलेट पैरामीटर अनुमान (के रूप में आप एक टेम्प्लेटेड निर्माता के साथ क्या करना होगा) और प्रकार के && लागू करने में कठिनाई एक सार्वभौमिक संदर्भ बनाता है, जो कि किसी भी प्रकार के सीवी योग्यता के साथ किसी भी प्रकार से मेल खाता है, चाहे वह एक अंतराल या रावल्यू संदर्भ है।

तो आपके मामले में आप एक A में गुजर रहे हैं, और इसलिए Args... = A &, Args &&... = A & &&, जो संदर्भ-टूट नियम, जो const A & तुलना में एक बेहतर मुकाबला नहीं है करने के लिए A & धन्यवाद है, क्योंकि संकलक नहीं है एक गैर-स्थिर चर के लिए स्थिरता जोड़ने के लिए है।

+1

ओह, मैं देखता हूं। स्पष्ट स्पष्टीकरण के लिए धन्यवाद। :) – Sungmin

3

मुझे लगता है कि इस मामले में टेम्पलेट कन्स्ट्रक्टर एक बेहतर मैच है क्योंकि यह गैर-कॉन्स वैल्यू लेता है। यदि आप const को a बदलने इसमें सी ++ 11 प्रतिलिपि निर्माता कहेंगे ...

const A a(3,2); 
A b = a; 
+0

धन्यवाद अगर मैं एक और प्रतिलिपि निर्माता 'ए (ए और) = डिफ़ॉल्ट' जोड़ता हूं। यह ठीक संकलित करता है। :) – Sungmin

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

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