2014-04-11 21 views

Trả lời

18

&bộ định tính lại. Các bộ định tính lại là mới trong C++ 11 và chưa được hỗ trợ trong tất cả các trình biên dịch, do đó bạn không thấy chúng thường xuyên. Nó chỉ ra rằng chức năng này chỉ có thể được gọi vào lvalues ​​(và không phải trên rvalues):

#include <iostream> 

class kitten 
{ 
private: 
    int mood = 0; 

public: 
    void pet() & 
    { 
     mood += 1; 
    } 
}; 

int main() 
{ 
    kitten cat{}; 
    cat.pet(); // ok 

    kitten{}.pet(); // not ok: cannot pet a temporary kitten 
} 

Kết hợp với cv-vòng loại const, nó có nghĩa là bạn chỉ có thể gọi hàm thành viên này trên lvalues, và đó có thể là const.

+4

Bạn có thể thêm rằng đây là một tính năng mới trong C++ 11, chưa được hỗ trợ bởi tất cả trình biên dịch và bạn không có khả năng để xem nó trong mã hiện tại (chưa). –

+3

Sự liên quan của cấu trúc này là nó cấm những thứ như 'Beta_ab const & danger = Beta_ab(). GetAB();' –

+0

OK, tôi hiểu. Vì vậy, nếu được trình biên dịch hỗ trợ, điều này nên được đặt trên mọi hàm thành viên const trả về tham chiếu const cho biến thành viên? Tôi có rất nhiều trong số này và đôi khi có lỗi liên quan đến việc sử dụng chúng trên một rvalue. – galinette

3

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ỏ .

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