تقارير Visual Studio 2015 C2280: استكشاف مشكلة "منشئ النسخة المحذوفة"
في Visual Studio 2013، يتم تنفيذ تجميع التعليمات البرمجية التالية دون أخطاء :
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
ومع ذلك، عند التحويل البرمجي في Visual Studio 2015 RC، يظهر المترجم الخطأ C2280:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
السبب وراء الخطأ
يتصرف Visual Studio 2015 بشكل مختلف عن سابقه. وفقًا لمعيار C، إذا أعلن تعريف الفئة عن مُنشئ نقل أو عامل نقل المهمة، فإن المترجم يقوم ضمنيًا بإنشاء مُنشئ نسخة وعامل مهمة النسخ كما تم حذفه. هذا هو الحال في مقتطف التعليمات البرمجية المقدم، حيث يوجد مُنشئ النقل.معالجة المشكلة
لحل خطأ الترجمة، يجب الإعلان الصريح عن النسخة يعد المُنشئ وعامل تعيين النسخ كإعداد افتراضي ضروريًا:
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
مع هذا التعديل، سيقوم المترجم بإنشاء مُنشئ النسخ المطلوب وعامل تعيين النسخ دون وضع علامة عليهما كمحذوفين.اعتبارات إضافية
إذا قام الفصل بتعريف دلالات النقل، فمن المستحسن عمومًا تعريف عامل تعيين النقل والمدمر أيضًا. إن اتباع مبدأ "قاعدة الخمسة" يمكن أن يساعد في ضمان الإدارة السليمة للموارد.تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3