"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل يمكنك تعيين مراجع Rvalue لنوع الفصل؟ وأوضح مفارقة.

هل يمكنك تعيين مراجع Rvalue لنوع الفصل؟ وأوضح مفارقة.

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

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

تعيين مراجع Rvalue لنوع الفئة: حل مفارقة

في عالم لغة C، يعد التمييز بين القيم l وقيم r أمرًا بالغ الأهمية. تمثل قيم L كائنات ذات مواقع ذاكرة يمكن تعديلها، بينما تجسد قيم r كائنات مؤقتة أو ثوابت لا يمكن تعديلها. ومع ذلك، يثير مقتطف التعليمات البرمجية المثير للاهتمام تساؤلات حول هذا الانقسام الأساسي:

class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // Here lies the enigma!
    return 0;
}

لماذا يتم تجميع هذا الرمز؟ أليست القيمة r التي أرجعها المنشئ سريعة الزوال وبالتالي غير صالحة للتخصيص؟

يكمن مفتاح فهم هذه المفارقة في عامل التعيين الضمني في لغة C. عندما لا يتم تعريف عامل التعيين بشكل صريح لفئة ما، يقوم المترجم بتجميع عامل التعيين الافتراضي. بشكل حاسم، يمكن تطبيق عامل التشغيل المركب هذا على قيم r في بعض الحالات.

هذا هو المكان الذي تلعب فيه الكلمة الأساسية الصريحة دورًا. في المثال الموضح، لا تعلن الفئة Y عن عامل التعيين، لذلك يقوم المترجم بإنشاء واحد. تمنع الكلمة الأساسية الصريحة التحويلات الضمنية من قيم r، ولكنها لا تمنع عامل التعيين المركب من أن يكون قابلاً للتطبيق على قيم r.

وهكذا، في الكود الخاص بنا، عامل التخصيص المركب:

Y& Y::operator=(Y const&);

أو

Y& Y::operator=(Y&);
يمكن استدعاؤها باستخدام القيمة r Y (١) في الجانب الأيسر. يسمح هذا بمواصلة التعيين، على الرغم من أن Y(1) عبارة عن قيمة r.

لمنع التعيين إلى كائنات مؤقتة، يمكن للمرء أن يعلن بوضوح عن عامل التعيين باستخدام مؤهل المرجع (&):

class Y {
public:
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};
في هذه الحالة، لن يتم تجميع عامل التعيين، وستؤدي محاولة التعيين إلى قيمة r إلى حدوث خطأ في الترجمة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3