Chúng ta biết rằng trong mã này ...
Beta_ab const& getAB() const { return ab; }
^^^^^
khoanh tròn const
có nghĩa là hàm thành viên có thể được gọi khi một đối tượng const
. Chức năng thành viên luôn có thể được gọi khi một đối tượng không phải là const
bất kể chức năng cv của hàm.
Vì vậy, trong mã này ...
Beta_ab const& getAB() const & { return ab; }
^
Chúng ta nên hy vọng rằng các nhấn mạnh &
cũng nói điều gì đó về những loại đối tượng chức năng của thành viên này được phép được kêu gọi. Chúng tôi sẽ chính xác; trong C++ 11, điều này nói rằng hàm thành viên chỉ có thể được gọi dựa trên các giá trị.
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return ab; }
Trong ví dụ trên, sự quá tải đầu tiên được gọi vào lvalues, và sự quá tải thứ hai được gọi vào phi const
rvalues. Tương tự như sau ví dụ quen thuộc hơn, với vòng loại áp dụng cho thông số chức năng bình thường:
void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB && _ab) { ab = std::move(_ab); }
Nó hoạt động hơi khác nhau cho các thông số bình thường mặc dù, như trong ví dụ này, sự quá tải đầu tiên sẽ chấp nhận một rvalue nếu quá tải thứ hai đã được gỡ bỏ .
Related/duplicate: http://stackoverflow.com/q/21861148/420683 – dyp