Тема: Типи виразів у С++
Вітаю! По ходу свого вивчення С++ зіткнувся з виразами, зокрема новими, які вроді появилися відносно не давно (rvalue, glvalue, prvalue, xvalue, lvalue). Lvalue начебто просто - все, від чого можна брати адрес. А ось різницю між xvalue і prvalue я до кінця так і не зрозумів, як визначити, що є що? Як наступний код з lvalue робить xvalue і чому це xvalue, а не prvalue?
#include <iostream>
using namespace std;
struct Cat
{
};
int main()
{
Cat&& cat = Cat();
cout << &(static_cast<Cat&&>(cat)); // Помилка
cout << &cat; // Все ок
}
Що зробив static_cast? По суті він же привів тип T до типу T? Що він змінив?
Ще питання, навіщо потрібно поділ на rvalue і glvalue?
І чому від rvalue reference можна брати адрес? Це хіба не тимчасовий об'єкт?
Якщо щось наплутав, будь ласка, поправте.