Lvalue مقابل Rvalue: التمييز بينهما
فكّر في فئات القيم: lvalues وprvalues وxvalues.
Lvalue مقابل Rvalue: التمييز بينهما درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
عالمان: Lvalue وRvalue
كل تعبير في C++ هو إما lvalue (كائن له اسم وعنوان) أو rvalue (كائن مؤقت ليس له اسم).
Lvalues
يشير lvalue إلى كائن دائم — ويمكنك الحصول على عنوانه باستخدام &.
int x = 42; // x is an lvalue
int* p = &x; // taking the address of an lvalue
int& r = x; // r is an lvalue referenceRvalues
rvalue هو كائن مؤقت — مثل القيم الحرفية وقيم إرجاع الدوال والتعبيرات مثل a + b. ولا يمكن الحصول على عنوانه.
int a = 5, b = 3;
int c = a + b; // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvalueلماذا يهم هذا التمييز؟
يوشك rvalue على أن يُتلف. ويمكننا بأمان الاستيلاء على موارده بدلًا من نسخها — وهذا هو أساس دلالات النقل.
الفئات الثلاث منذ C++11
تُحسّن C++ الحديثة هذا النموذج:
- lvalue — له اسم وهوية
- prvalue (rvalue خالص) — كائن مؤقت خالص (قيمة حرفية أو إرجاع بالقيمة)
- xvalue (منتهي الصلاحية) — يوشك على الانتهاء (ناتج
std::move)
مراجع lvalue ومراجع rvalue
يستخدم مرجع lvalue الرمز &، بينما يستخدم مرجع rvalue الرمز &&.
int x = 10;
int& lr = x; // lvalue reference
int&& rr = 42; // rvalue reference, binds to literalقواعد الربط
توافق الأنواع:
- يرتبط مرجع lvalue (
T&) بـ lvalues - يرتبط مرجع lvalue الثابت (
const T&) بكليهما - يرتبط مرجع rvalue (
T&&) بـ rvalues فقط (وxvalues)
التحقّق باستخدام decltype
يمكنك سؤال المصرّف عن فئة تعبير ما باستخدام decltype عليه.
int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue refلماذا أضافت C++11 مراجع rvalue؟
لتمكين دلالات النقل: يستطيع مُنشئ يقبل T&& الاستيلاء على البيانات الداخلية لكائن مؤقت، متجنّبًا النسخ العميق.
خطأ شائع: مرجع rvalue المسمّى هو lvalue
بمجرد التصريح عن متغير مرجع rvalue، يصبح له اسم — ما يجعله lvalue. ولتمريره بوصفه rvalue، استخدم std::move.
void f(std::string&& s) {
// s here is an lvalue!
process(std::move(s)); // now it is an rvalue again
}لمحة عن التمرير المثالي
تستنتج القوالب التي تقبل T&& إما مرجع lvalue أو مرجع rvalue. وبدمجها مع std::forward، يمكنها الحفاظ على فئة القيمة — وسيُشرح ذلك بالتفصيل لاحقًا.
تحقّق سريعًا
أيٌّ من هذه التعبيرات هو rvalue؟
مراجعة
لـ lvalue اسم وعنوان، بينما rvalue كائن مؤقت. يرتبط T& بـ lvalues، ويرتبط T&& بـ rvalues. يتيح هذا التمييز دلالات النقل، ما يتجنّب النسخ غير الضروري للكائنات المؤقتة.
الأسئلة الشائعة
هل درس «Lvalue مقابل Rvalue: التمييز بينهما» مجاني؟
نعم — نص درس «Lvalue مقابل Rvalue: التمييز بينهما» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «Lvalue مقابل Rvalue: التمييز بينهما»؟
فكّر في فئات القيم: lvalues وprvalues وxvalues. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «Lvalue مقابل Rvalue: التمييز بينهما»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Lvalue مقابل Rvalue: التمييز بينهما
- مراجع Rvalue وصياغة &&
- std::move وstd::forward
- منشئات النقل وإسناد النقل