कुछ शोध करने के बाद, मुझे लगता है कि C++11 has a defect उन आवंटकों के साथ जिन्हें प्रकार को चलने योग्य/प्रतिलिपि बनाने की आवश्यकता होती है। मुझे यकीन है कि यह इस समस्या का कारण है, हालांकि मैं हटाए गए और घोषित चाल semantics के बीच व्यवहार के बारे में उलझन में हूँ।हटाए गए कदम सेमेन्टिक्स क्यों std :: vector के साथ समस्याएं पैदा करते हैं?
मैं निम्नलिखित कोड है जो दोनों MSVC12 और बजना पर संकलित करने के लिए विफल रहता है:
xmemory0(600): error C2280: 'Copyable::Copyable(Copyable &&)' : attempting to reference a deleted function
और बजना पर (live sample):
#include <vector>
class Copyable
{
public:
Copyable() = default;
Copyable(Copyable const& other)
: m_int(other.m_int)
{}
Copyable& operator= (Copyable const& other)
{
m_int = other.m_int;
return *this;
}
Copyable(Copyable&&) = delete;
Copyable& operator= (Copyable&&) = delete;
private:
int m_int = 100;
};
int main()
{
std::vector<Copyable> objects;
objects.push_back(Copyable{});
}
इस के साथ MSVC पर संकलित करने के लिए विफल रहता है
new_allocator.h:120:23: error: call to deleted constructor of 'Copyable'
दोनों मामलों में, जब मैं स्पष्ट रूप से हटाए गए कदम निर्माण/असाइन को हटा देता हूं विधियों, कोड संकलन। AFAIK जब आप कॉपी असाइन/निर्माण विधियों की घोषणा करते हैं, तो संकलक स्पष्ट रूप से संबंधित चाल सदस्यों को घोषित नहीं करता है। तो उन्हें अभी भी प्रभावी रूप से हटा दिया जाना चाहिए, है ना? जब मैं चाल निर्माण/असाइनमेंट के स्पष्ट विलोपन को हटाता हूं तो कोड संकलित क्यों होता है?
सामान्य रूप से इस सी ++ 11 दोष के लिए अच्छा कामकाज क्या है? मैं नहीं चाहता कि मेरी वस्तुएं चलने योग्य हों (लेकिन वे कॉपी करने योग्य हैं)।
एक प्रतिलिपि के माध्यम से आगे बढ़ना लागू करें? –
इसके अलावा: [सी ++ 11-हटाए गए फ़ंक्शन ओवरलोड रिज़ॉल्यूशन में क्यों भाग लेते हैं?] (Http: // stackoverflow।कॉम/प्रश्न/14085620/क्यों-डू-सी 11-हटाए गए-फ़ंक्शंस-भाग-इन-ओवरलोड-रिज़ॉल्यूशन) – Nawaz