مراجع Rvalue وصياغة &&
اربط المراجع المؤقتة باستخدام مراجع Rvalue لنقل الموارد بكفاءة.
مراجع Rvalue وصياغة && درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
صيغة &&
يُصرَّح عن مرجع rvalue باستخدام T&&. ولا يرتبط إلا بـ rvalues، أي الكائنات المؤقتة التي توشك على الانتهاء.
int&& ref = 42; // OK: binds to literal
int x = 10;
// int&& bad = x; // ERROR: x is an lvalueلماذا نستخدم مراجع rvalue؟
تتيح لك كتابة دوال تعرف أن الوسيط على وشك أن يُتلف. ويمكنك الاستيلاء على موارده دون إنشاء نسخة.
التحميل الزائد للدوال حسب نوع المرجع
يمكنك تحميل دالة تحميلًا زائدًا لـ T& وT&&. ويختار المصرّف الدالة الصحيحة استنادًا إلى فئة الوسيط.
void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }
std::string s = "hi";
process(s); // lvalue
process("temp"); // rvalue
process(std::move(s)); // rvalueتصبح مراجع rvalue المسمّاة lvalues
بمجرد منح مرجع rvalue اسمًا، يصبح ذلك الاسم نفسه lvalue — إذ تُثبَّت هويته. استخدم std::move لاستعادة كونه rvalue.
void f(std::string&& s) {
// inside f, the parameter s is an lvalue
g(s); // passes s by lvalue
h(std::move(s)); // passes s as an rvalue
}std::move هو تحويل نوع
لا ينقل std::move(x) أي شيء بمفرده — بل هو تحويل نوع يعيد x بوصفه مرجع rvalue. ويحدث النقل الفعلي في المُنشئ الذي يتلقى الكائن.
// equivalent to
static_cast<std::string&&>(s)لماذا يُسمّى Move؟
يعكس الاسم الاستخدام المعتاد — تمرير كائن تنوي الاستيلاء على محتوياته — لكنه لا ينقل أي شيء بمفرده.
المراجع الشاملة (مراجع التمرير)
عندما يظهر T&& في قالب مع استنتاج T، فإنه يكون مرجع تمرير — ويرتبط بكل من lvalues وrvalues مع الحفاظ على الفئة.
template <typename T>
void wrapper(T&& arg) {
process(std::forward<T>(arg));
}دمج المراجع
عندما تتراكم المراجع عبر القوالب، تدمجها اللغة:
T& &→T&T& &&→T&T&& &→T&T&& &&→T&&
متى لا تستخدم Move؟
بالنسبة إلى الأنواع القابلة للنسخ تافهًا (int وdouble والمؤشر)، يكون النقل مماثلًا للنسخ. لا يضيف استدعاء std::move أي فائدة، وقد يربك القرّاء.
النقل دون امتلاك موارد
بالنسبة إلى الأنواع التي لا تملك موارد في الذاكرة المكدّسة، يكون مُنشئ النقل مماثلًا لمُنشئ النسخ. ولا يكون النقل مفيدًا إلا للأنواع التي تملك ذاكرة ديناميكية.
مطب شائع: النقل من const
يُعدّ استخدام std::move على كائن const عمليةً بلا تأثير — فلا يمكن استدعاء مُنشئ النقل على const لأنه سيحتاج إلى تعديل المصدر.
تحقّق سريعًا
ما الذي يفعله std::move(x) فعليًا؟
مراجعة
يرتبط T&& بـ rvalues. وتصبح مراجع rvalue المسمّاة lvalues، لذا استخدم std::move لاستعادتها. ويكون T&& في القالب مرجع تمرير. أما std::move فهو تحويل نوع، ولا ينفّذ النقل بنفسه.
الأسئلة الشائعة
هل درس «مراجع Rvalue وصياغة &&» مجاني؟
نعم — نص درس «مراجع Rvalue وصياغة &&» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «مراجع Rvalue وصياغة &&»؟
اربط المراجع المؤقتة باستخدام مراجع Rvalue لنقل الموارد بكفاءة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «مراجع Rvalue وصياغة &&»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Lvalue مقابل Rvalue: التمييز بينهما
- مراجع Rvalue وصياغة &&
- std::move وstd::forward
- منشئات النقل وإسناد النقل