Hãy xem xét các lớp sau đây:
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;
}
};
Khái niệm some_foo.copy_of_name()
là một prvalue, vì copy_of_name
trả về một đối tượng (std::string
), không phải là một tài liệu tham khảo. Mỗi prvalue cũng là một rvalue. (Rvalues là tổng quát hơn.)
Khái niệm some_foo.original_name()
là một vế trái, vì original_name
trả về một tài liệu tham khảo giá trị trái (std::string&
). Mỗi lvalue cũng là một glvalue. (Glvalues là tổng quát hơn.)
Khái niệm std::move(some_name)
là một Xvalue, vì std::move
trả về một tham chiếu rvalue (std::string&&
). Mỗi xvalue cũng là cả glvalue và rvalue.
Lưu ý rằng tên cho các đối tượng và tài liệu tham khảo luôn lvalues:
std::string a;
std::string& b;
std::string&& c;
Với tuyên bố trên, các từ ngữ a
, b
và c
là lvalues.
"ví dụ thực tế"? Bạn có nghĩa là như đốm một xvalue trong siêu thị, hoặc tự hỏi liệu chiếc xe của bạn có thể được phân loại như lvalue? – jalf
hehe, những gì tôi có nghĩa là ví dụ thực tế –