2011-07-07 29 views
42

Tôi đã tự hỏi liệu có ai có thể nói hoặc giải thích một số ví dụ thực tế về xvalues, glvalues ​​và prvalues ​​không ?. Tôi đã đọc một câu hỏi tương tự:Ví dụ thực tế về xvalues, glvalues ​​và prvalues?

What are rvalues, lvalues, xvalues, glvalues, and prvalues?

nhưng tôi không hiểu ý nghĩa của mọi người. Bất cứ ai có thể giải thích trong trường hợp những giá trị này là quan trọng và khi một nên sử dụng chúng?

+14

"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

+0

hehe, những gì tôi có nghĩa là ví dụ thực tế –

Trả lời

46

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_nametrả 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_nametrả 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::movetrả 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, bc là lvalues.

+0

Bạn có thể giải thích khi nào nên tham khảo rvalue nên được sử dụng? –

+0

@ M3taSpl0it: Di chuyển các hàm tạo và di chuyển các toán tử gán có tham số tham chiếu rvalue. Ngoài ra, có rất ít sử dụng cho họ. Hầu hết thời gian, chúng được chôn sâu bên trong mã thư viện và mã của riêng bạn không cần phải bận tâm với các tham chiếu rvalue. – fredoverflow

+0

Bạn đang thiếu một ví dụ quan trọng về cơ bản. Hàm trả về tham chiếu có đủ điều kiện cv: 'std :: string const & reference_of_name() const'. Đây sẽ là một giá trị đúng, phải không? –

Các vấn đề liên quan