2014-08-27 12 views
12

जब एक स्पष्ट प्रतिलिपि ctor होने वस्तुओं की एक कंटेनर छँटाई मैं संकलक त्रुटियों मैं डॉन (छ ++ से 4.8.2 और बजना ++ 3.4, दोनों -std = C++ 11 मोड में) कि 't समझ। मैं एक साधारण उदाहरण बना लिया है समस्या बजना ++ में औरस्पष्ट प्रतिलिपि निर्माता और std :: तरह

error: no matching function for call to ‘A::A(std::remove_reference<A&>::type) 
ग्राम में

साथ ++

error: 
    no matching constructor for initialization of '_ValueType' (aka 'A') 

साथ

class A { 
public: 
    explicit A(int i): m_i(i) {}; 
    explicit A(const A& other): m_i(other.m_i) {}; 
    int i() const {return m_i;}; 
private: 
    int m_i; 
}; 

bool is_less(const A& a, const A& b) { 
    return a.i() < b.i(); 
} 

int main(int, char*[]) { 
    std::vector<A> objects; 
    objects.push_back(A(3)); 
    objects.push_back(A(5)); 
    objects.push_back(A(-1)); 

    std::cout << is_less(objects[1], objects[2]); 
    std::sort(objects.begin(), objects.end(), is_less); 

    for (auto& a: objects) { 
    std::cout << a.i() << " "; 
    } 
    std::cout << std::endl; 
} 

यह विफल रहता है प्रदर्शित करने के लिए। कोड संकलित करता है और ठीक काम करता है अगर कॉपी कन्स्ट्रक्टर स्पष्ट नहीं है (लेकिन मैं यह लागू करना चाहता हूं कि केवल मेरे ऑब्जेक्ट्स के संदर्भ पैरामीटर के रूप में उपयोग किए जा सकें और मान वापस कर सकें)। यह कोड std::sort पर कॉल को हटाने के बाद भी संकलित करता है (इसलिए is_less(objects[1], objects[2]) कोई समस्या नहीं है)। इसलिए मेरा सवाल यह है कि std :: सॉर्ट करता है जब तुलना करने वाले फ़ंक्शन को कॉल करते हैं जो इस कोड को संकलित करता है और इसे ठीक कैसे किया जाता है।

अनुसंधान के एक बहुत बाद, केवल सवाल यह है कि मेरी समस्या के करीब आ गया In copy-initialization, is the call to the copy constructor explicit or implicit? जो जीसीसी में एक बग के लिए लिंक है। हालांकि, क्लैंग एक ही व्यवहार दिखाता है, इसलिए मैं वास्तव में समझना चाहता हूं कि क्या हो रहा है।

+6

केवल पागल लोग प्रतिलिपि बनाने वाले 'स्पष्ट' बनाते हैं, ऐसे प्रकार प्रतिलिपि बनाने योग्य नहीं हैं –

उत्तर

12

std::sort की आवश्यकता है कि तत्व प्रकार MoveConstructible हो।

MoveConstructible राज्य कि अभिव्यक्ति T u = rv; मान्य होना चाहिए के लिए आवश्यकताओं। हालांकि, यह अभिव्यक्ति प्रति प्रारंभिकरण करता है और यह आवश्यक है कि एक गैर-स्पष्ट प्रतिलिपि या चालक को स्थानांतरित करें।

इस मामले में, प्रतिलिपि निर्माता स्पष्ट है, और घोषणा की तो इसका मतलब यह है कि वहाँ कोई परोक्ष-घोषित चाल निर्माता। इसलिए, अभिव्यक्ति अमान्य है, और वर्ग AMoveConstructible नहीं है।

+7

अभिव्यक्ति अमान्य क्या है कि कॉपी कन्स्ट्रक्टर स्पष्ट नहीं है, बल्कि यह भी कि पहले में एक प्रतिलिपि बनाने वाला साइड इफेक्ट के रूप में जगह, चाल कन्स्ट्रक्टर अक्षम है। एक चालक कन्स्ट्रक्टर के साथ और असाइनमेंट ऑपरेटर ले जाएं, यह काम करता है, भले ही कॉपी कन्स्ट्रक्टर अभी भी स्पष्ट है। – hvd

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