जब एक स्पष्ट प्रतिलिपि 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? जो जीसीसी में एक बग के लिए लिंक है। हालांकि, क्लैंग एक ही व्यवहार दिखाता है, इसलिए मैं वास्तव में समझना चाहता हूं कि क्या हो रहा है।
केवल पागल लोग प्रतिलिपि बनाने वाले 'स्पष्ट' बनाते हैं, ऐसे प्रकार प्रतिलिपि बनाने योग्य नहीं हैं –