Trong bài viết này chúng ta sẽ thảo luận về tham chiếu rvalue là gì và nó khác với tham chiếu lvalue như thế nào.
Tham chiếu lvalue
Trước C++11, chúng ta chỉ có các tham chiếu. Biến tham chiếu là một bí danh luôn trỏ đến một biến hiện có, tức là.
int x = 7;
int & refX = x; // refX is a reference
Với C++11 tham chiếu này đã trở thành tham chiếu lvalue và nó chỉ có thể tham chiếu đến lvalue, tức là
int & lvalueRef = x; // lvalueRef is a lvalue reference
Ở đây, lvalueRef là một tham chiếu lvalue trỏ đến một lvalue x. Một tham chiếu lvalue không thể trỏ đến một rvalue, tức là
int & lvalueRef2 = (x+1); // COMPILE Error - lvalue Reference Can't point to rvalue
Ở đây lvalueRef2 là một tham chiếu lvalue, vì vậy nó không thể trỏ đến một rvalue.
Tham chiếu rvalue
Tham chiếu rvalue được giới thiệu trong C++11 và tham chiếu rvalue có thể thực hiện những gì mà tham chiếu lvalue không làm được, tức là tham chiếu rvalue có thể tham chiếu đến rvalue.
Để khai báo một tham chiếu rvalue, chúng ta cần chỉ định hai toán tử &, tức là &&.
int && rvalueRef = (x+1); // rvalueRef is rvalue reference
Ở đây, rvalueRef là tham chiếu rvalue trỏ đến một rvalue tức là (x + 1).
Hãy xem một ví dụ khác,
int getData()
{
return 9;
}
int & lvalueRef3 = getData(); // Compile error - lvalue Reference Can't point to rvalue
const int & lvalueRef3 = getData(); // OK but its const
int && rvalueRef2 = getData();
Ở dòng 5, getData () là một rvalue. Vì vậy, chỉ tham chiếu rvalue mới có thể tham chiếu đến nó. Nếu tham chiếu lvalue sẽ cố gắng tham chiếu đến nó thì sẽ dẫn đến lỗi biên dịch. Dòng 6, mặc dù tham chiếu const lvalue có thể tham chiếu đến đối tượng tạm thời được trả về bởi getData() nhưng vì là tham chiếu const, chúng ta không thể sửa đổi giá trị tạm thời này. Nhưng một tham chiếu rvalue như dòng 7 có thể tham chiếu đến rvalue mà không cần có const.
Bây giờ, khi chúng ta đã hiểu các tham chiếu rvalue, câu hỏi tiếp theo xuất hiện trong đầu là, tại sao lại cần có tham chiếu rvalue trong C++11? Ta sẽ bàn đến vấn đề này trong bài viết tiếp theo.
Để lại một bình luận