вступление

Лучше изначально сразу попробовать обозвать все правильно, что у нас слева и справа от знака =.

Левосторонне выражение = правостороннее выражение.

LValue = RValue

Понятие RValue ссылка изначально появилось как присваиваемое значение (объект), который находится справа от знака присваивания (=).

Соответственно, то что слева это левостороння ссылка LValue. Вроде все понятно, если бы не нюансы, возникшие в стандарте С11 (2011г.) RValue понятие начало активно развиваться. Не было печали...

Теперь надо учитывать, что значение справа не всегда будет RValue ссылкой, а может быть и LValue ссылкой. 

И теперь RValue - это будет считаться, то что нельзя расположить слева от знака присваивания (=).

int a=15;
a=a; // a (слева) это LValue ссылка, a (справа) это тоже LValue ссылка
a=123; // 123 это RValue

что надо понимать
int a = 33;
int b = a; // конструктор копирования вызывается 

Левостороннее выражение может быть не только переменной, но функцией. Правостороннее выражение тоже может быть переменной, функцией, литералом (5, true, nullptr, кроме строкового).

фотка 1

Стандарт C 17 определяет категории значений выражений следующим образом:

  • Glvalue — это выражение, вычисление которого определяет удостоверение объекта, битового поля или функции.
  • Prvalue — это выражение, вычисление которого инициализирует объект или битовое поле, или вычисляет значение операнда оператора, как указано в контексте, в котором он отображается.
  • Xvalue — это значение glvalue, обозначающее объект или битовое поле, ресурсы которого можно использовать повторно (обычно потому, что он находится в конце его существования). Пример. Некоторые виды выражений, в которых содержатся ссылки rvalue (8.3.2), возвращают значения xvalue, например вызов функции, возвращаемой типом которого является ссылка rvalue или приведение к ссылочным типам rvalue.
  • Lvalue — это значение glvalue, которое не является xvalue.
  • Rvalue — это prvalue или xvalue.