Грубо говоря, rvalues являются временными объектами (возвращенными из функции), а lvalues - это объекты, которые вы также можете ссылаться.
Например:
X bar();
X x = bar();
в этом коде (игнорируя возможные оптимизации компилятора), временный объект X создается для хранения возвращаемого значения обув и передается x
«s копирования конструктору, этот временный объект является rvalue, только живет внутри этого утверждения и не может ссылаться на другие части кода. x
однако является lvalue, вы можете получить его адрес и обратиться к нему позже.
Обе функции
void foo(X &);
void foo(const X &);
ожидать lvalues, неконстантный и сопзИте соответственно. Причина, по которой позже принимает значения r, заключается в том, что rvalues могут быть преобразованы в const-ссылки на lvalues. То есть, вы можете сделать это:
const X &ref = bar();
здесь временный возвращаемый баром() не разрушаются до ref
выходит из области видимости, поэтому его срок службы был продлен за пределами заявления. Однако вы не можете сделать то же самое с неконстантными ссылками,
X &ref = bar(); // Error!
это не допускается причиной возвращенного значения бара является временным (Rvalue) и не может быть изменен.
Обратите внимание, что это не функция C++ 11, это уже было. Новая функция является возможность указать RValue ссылки
void foo(X &&);
void foo(const X &&);
, который вводит еще более нюансами ситуации, смотри, например, Universal References in C++11 - Scott Meyers.
Это хорошо, спасибо. – cpp11dev