Помните о двух свойствах, думая о ценности выражения, идентичности и способности двигаться.Выражение имеет идентификатор, если оно имеет имя или адрес, и может быть перемещено, если срок его действия истекает после вычисления выражения.
- Lvalue = имеет идентификатор и не может быть перемещен
- Xvalue = имеет идентификатор и является подвижным
- Rvalue = не имеет идентификатора и является подвижным
refToRef возвращает по ссылке lvalue, поэтому Obj
, на который ссылается refToRef(o)
,объект с идентификатором (определено &refToRef(o)
), и он все еще будет присутствовать после вычисления выражения.Следовательно, refToRef(o)
является lvalue.
Кроме того, будьте осторожны, чтобы не перепутать тип со значением.Если я добавлю функцию, которая возвращает значение, и создам из нее ссылку на rvalue, ссылка на rvalue будет lvalue.Например,
class Obj {};
Obj& refToRef(Obj& o) {
return o;
}
Obj refToVal(Obj& o) {
return o;
}
int main() {
Obj o;
Obj& o2 = refToRef(o);
Obj&& o3 = refToVal(o);
}
o3
имеет тип rvalue refernce to Obj
, а в качестве выражения - lvalue
.