lvalue یعنی متغیری که حافظه داشته باشه و حافظش با & قابل دسترس باشه
rvalue متغیریه که حافظش موقته یا به عبارتی متغیریه که lvalue نیست
مثلا توی کد زیر 2 از نوع rvalue هست ولی x از نوع lvalue
int x;
x=2 ;
جالا اگر برعکس تعریف کنیم یعنی
2=x
این جا کامپایلر همون اروری که گفتی رو میده جون شما می خوای به یک متغیر که حافظه موقت داره مقدار بدی
2 تا نکته :
لزوما سمت راست بودن تساوی معنی rvalue بودن رو نمیده مثلا کد زیر هر 2 تا مقدار lvalue هستن :
int a=1;
int b=2;
a=b;//a,b are lvalue
توی c++ حتی در بعضی از موارد lvalue در سمت چپ تساوی هم نمی تونه قرار بگیره مثلا زمانی که از شی از کلاس استفاده می کنین که operator= براش تعریف نشده .
چند تا مثال :
int x, *pInt; // x, pInt, *pInt are lvalues
std::size_t f(std::string str); // str is lvalue, f's return is rvalue
f("Hello"); // temp string created for call is rvalue
std::vector<int> vi; // vi is lvalue
…
vi[5] = 0; // vi[5] is lvalue