Сейчас хорошее время, чтобы узнать, что такое xvalues и glvalues .
Rvalues может быть двух типов - prvalues и xvalues . Согласно новому стандарту C ++ 17
prvalue - это выражение, оценка которого инициализирует объект, битовое поле или операнд оператора в соответствии с контекстом, в котором оно появляется.
поэтому что-то вроде fun()
в вашем примере оценивается как prvalue (которое является rvalue). Это также говорит нам, что fun().v
не является значением prvalue, поскольку это не обычная инициализация.
Значения X, которые также являются значениями r, определяются следующим образом
xvalue (значение "eXpiring") также относится к объекту, обычно ближе к концу его жизненного цикла (например, чтобы его ресурсы можно было перемещать). Определенные виды выражений, включающие ссылки на rvalue (8.3.2), дают значения x. [Пример: результатом вызова функции, возвращаемый тип которой является ссылкой rvalue на тип объекта, является xvalue (5.2.2). - конец примера]
В дополнение к rvalues другой зонтичной категорией значений является glvalue, которая бывает двух типов: xvalues и традиционные lvalues .
На этом этапе мы определили основные категории ценностей. Это можно визуализировать так
В широком смысле можно подумать, что категория glvalue означает то, что должны были означать lvalue до того, как семантика перемещения стала вещью - вещью, которая может находиться в левой части выражения. glvalue означает обобщенное lvalue.
Если мы посмотрим на определение xvalue, то в нем говорится, что что-то является xvalue, если оно приближается к концу своего жизненного цикла. В вашем примере срок службы fun().v
близок к концу. Таким образом, его ресурсы можно перемещать. И поскольку его ресурсы могут быть перемещены, это не lvalue, поэтому ваше выражение соответствует единственной оставшейся категории конечных значений - xvalue.
person
Curious
schedule
04.04.2017
Foo
. В этом случаеFoo
относится к функции, аstruct Foo
- к типу. - person MSalters   schedule 08.02.2010struct f {}; void f(); void g() { f(); struct f a; }
. Вы можете прочитать подробное объяснение здесь: stackoverflow.com/questions / 1675351 / - person David Rodríguez - dribeas   schedule 08.02.2010