rvalue : یعنی مقادیر موقت.یا مقادیری که به شی خاصی اشاره نمی کنن (مثل true , 7 , ... )
متغیر های از نوع rvalue به 2 دسته تقسیم میشن xvalue ,prvalue
xvalue یعنی rvalue هایی که اسم ندارند و در حال نابودی هستند ( expiring value ) مثلا اگر مقدار بازگشتی تابعی rvalue&& باشه اون مقدار xvlue حساب میشه.مثل کدی که داخل سوالتون گداشتید چون در func().i به محض تمام شدن عبارت مقدار بازگشتی از Func پاک میشه و اسمی هم نداره و از نوع rvalue&& هم هست پس func().i از نوع xvalue به حساب میاد.
prvalue به rvalue ای گفته میشه که xvalue نباشه نمونش ثابت های عددی هستش یا مثلا توابعی که مقدار بدون refrence بر می گردونن یا true , false .
مثال :
int&& foo(int&& a){...}
foo(6)
//addad 6 az no e prvalue hast
//meghdari ke az foo bar migarde xvalue hast
//voroodi foo yani khode a az no e lvalue hast ke ba rvalue meghdar dehi mishe
int& foo2();
// meghdar bazgashti az foo2 lvalue hast
int foo3();
//meghdar bazgashti az foo3 prvalue hast
lvalue قابل تبدیل به rvalue نیست . ولی rvalue میتونه به lvalue هم تبدیل بشه .
int&& a = 5;//ok tabdil prvalue be rvalue refrence
int val = 7; //ok tabdil prvalue be lvalue
int& val2=7;//error tabdil prvalue be lvalue refrence(chon hafeze rvalue ghabel dastresi nist)
int b = a;//ok tabdil lvalue be lvalue
int c = std::move(a);//ok tabdil rvalue refrence be lvalue
int&& d= a ;//error tabdil lvalue be rvalue refrence
int&& d= std::move(a) ;//ok tabdil rvalue refrence be rvalue refrence