ما هي 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) بدلاً من نسخها.