"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يقوم Visual Studio 2015 بالإبلاغ عن الخطأ C2280 \"مُنشئ النسخة المحذوفة\" عند تجميع رمز مُنشئ النقل؟

لماذا يقوم Visual Studio 2015 بالإبلاغ عن الخطأ C2280 \"مُنشئ النسخة المحذوفة\" عند تجميع رمز مُنشئ النقل؟

تم النشر بتاريخ 2024-11-17
تصفح:929

Why Does Visual Studio 2015 Report Error C2280 \

تقارير 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