Ответ 1
Рассмотрим следующий класс:
class Foo
{
std::string name;
public:
Foo(std::string some_name) : name(std::move(some_name))
{
}
std::string& original_name()
{
return name;
}
std::string copy_of_name() const
{
return name;
}
};
Выражение some_foo.copy_of_name()
является prvalue, потому что copy_of_name
возвращает объект (std::string
), а не ссылку. Каждое prvalue также является rvalue. (Rvalues являются более общими.)
Выражение some_foo.original_name()
является lvalue, потому что original_name
возвращает ссылку lvalue (std::string&
). Каждое lvalue также является значением glvalue. (Glvalues более общие.)
Выражение std::move(some_name)
является xvalue, потому что std::move
возвращает ссылку rvalue (std::string&&
). Каждое значение x также является значением glvalue и rvalue.
Обратите внимание, что имена для объектов и ссылок всегда lvalues:
std::string a;
std::string& b;
std::string&& c;
Учитывая приведенные выше выражения, выражения a
, b
и c
являются lvalues.