Avatar ·

ما هي rvalues و lvalues و xvalues و glvalues و prvalues في C++؟

بدأت تعلم C++11 واصطدمت بمصطلحي "lvalue" و "rvalue"، لكن بعد ذلك رأيت أنهما أصبحا أكثر: xvalue و glvalue و prvalue. لقد تشوشت. في C++ القديم، كنت أفهم أن lvalue هو ما يقف على يسار الإسناد (مثل المتغير)، و rvalue هو ما يقف على اليمين (مثل الرقم 5). لكن في C++11 ظهرت move semantics و std::move، والآن لا أفهم إلى أين ينتمي التعبير std::move(x). هل هو lvalue أم rvalue؟ ولماذا يتحدثون عن "فئات القيم"؟ هذا مثال يربكني: ```cpp int x = 10; // x - lvalue int y = x + 5; // x+5 - rvalue int&& z = std::move(x); // ما هو std::move(x)؟ ``` سمعت أن هناك 5 فئات: lvalue و rvalue و xvalue و glvalue و prvalue. هل يمكنك شرحها بكلمات بسيطة مع أمثلة؟ وكيف ترتبط بـ move semantics والكائنات المؤقتة؟ <<>>

الفئات الأساسية للقيم في C++11 وما بعده

أنت محق: في C++11 أصبح التصنيف أكثر تعقيدًا بسبب move semantics. بدلاً من فئتين (lvalue/rvalue)، لدينا الآن خمس فئات. إليك شرح مبسط:

  • lvalue: تعبير يشير إلى كائن له موقع في الذاكرة (مثل متغير). مثال: x في int x = 10;.
  • rvalue: تعبير ليس له موقع دائم (مثل قيمة مؤقتة). في C++11، rvalue ينقسم إلى prvalue و xvalue.
  • prvalue (pure rvalue): قيمة نقية بدون موقع، مثل x + 5 أو 42.
  • xvalue (eXpiring value): قيمة تحتضر، لها موقع لكنها على وشك الانتهاء (مثل نتيجة std::move(x)).
  • glvalue (generalized lvalue): يشمل lvalue و xvalue (أي تعبير له موقع).

بالنسبة لـ std::move(x): إنها xvalue، لأنها تحول lvalue إلى rvalue (يمكن نقلها). لذا، std::move(x) هو rvalue (بالتحديد xvalue)، وليس lvalue.

العلاقة مع move semantics: تسمح هذه الفئات بتحسين الأداء عن طريق نقل الموارد من الكائنات المؤقتة (rvalues) بدلاً من نسخها.