विजुअल स्टूडियो 2015 रिपोर्ट C2280: "हटाए गए कॉपी कंस्ट्रक्टर" मुद्दे की खोज
विजुअल स्टूडियो 2013 में, निम्नलिखित कोड को संकलित करना त्रुटियों के बिना निष्पादित होता है :
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
हालाँकि, विज़ुअल स्टूडियो 2015 आरसी में संकलन करने पर, कंपाइलर त्रुटि C2280 उत्पन्न करता है:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
त्रुटि के पीछे का कारण
विजुअल स्टूडियो 2015 अपने पूर्ववर्ती की तुलना में अलग व्यवहार करता है। सी मानक के अनुसार, यदि कोई क्लास परिभाषा एक मूव कंस्ट्रक्टर या मूव असाइनमेंट ऑपरेटर घोषित करती है, तो कंपाइलर अंतर्निहित रूप से एक कॉपी कंस्ट्रक्टर और कॉपी असाइनमेंट ऑपरेटर को हटाए गए के रूप में उत्पन्न करता है। यह प्रदान किए गए कोड स्निपेट में मामला है, जहां मूव कंस्ट्रक्टर मौजूद है।
समस्या का समाधान
संकलन त्रुटि को हल करने के लिए, प्रतिलिपि की स्पष्ट घोषणा डिफॉल्ट के रूप में कंस्ट्रक्टर और कॉपी असाइनमेंट ऑपरेटर आवश्यक है:
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
इस संशोधन के साथ, कंपाइलर आवश्यक कॉपी कंस्ट्रक्टर और कॉपी असाइनमेंट ऑपरेटर को हटाए गए के रूप में चिह्नित किए बिना उत्पन्न करेगा।
अतिरिक्त विचार
यदि क्लास मूव सिमेंटिक्स को परिभाषित करता है, तो आम तौर पर मूव असाइनमेंट ऑपरेटर और डिस्ट्रक्टर को भी परिभाषित करने की सिफारिश की जाती है। "पांच का नियम" सिद्धांत का पालन करने से उचित संसाधन प्रबंधन सुनिश्चित करने में मदद मिल सकती है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3