Рассмотрим эти два примера.
const auto someValue = 43 * otherValue;
const auto someOther = func();
В обоих случаях правая часть присваиваемого является выражением. В первом случае это целочисленное умножение. Во втором вызове это вызов функции. Давайте будем максимально ясны: выражение не является результатом вызова функции - вместо этого func()
является выражением.
Представьте себе сигнатуру этого вызова функции
struct Obj { /* ... */ };
Obj&& func();
Здесь возвращаемый тип - это ссылка rvalue типа объекта. Это подразумевается формулировкой в стандарте. И в приведенном выше случае выражение func()
является xvalue («eXpiring value»).