2015-10-02 17 views
8

Tại sao công việc gia tăng trước nhưng sau tăng không có trên biến tham chiếu?Toán tử tăng trên biến tham chiếu

#include <iostream> 

void swap(int&, int&); 

int main() 
{ 
    int x=10, y=20; 
    int &a=x, &b=y; 
    swap(++a, ++b); //swap (a++,b++) is not allowed. 
    printf("%d %d ", a, b); 
    return 0; 
} 

void swap(int& x, int& y) 
{ 
    x+=2; 
    y+=3; 
} 

Tại sao swap(++a, ++b) phép nhưng swap(a++, b++) nói:

[Lỗi] khởi không hợp lệ tham chiếu không const của loại 'int &' từ một rvalue của loại 'int'

+0

Vì mục đích đơn giản, lưu ý rằng hành vi tương tự xảy ra nếu bạn cố gắng sử dụng '' '' '' '' và 'y' trực tiếp. Tham chiếu 'a' và' b' chỉ phục vụ để làm cho vấn đề xuất hiện phức tạp hơn nó. –

Trả lời

8

Khi bạn gọi

swap (a++,b++) 

a++b++ cung cấp cho bạn một đối tượng tạm thời vì tăng dần bài đăng trả về các giá trị trước đó. Vì swap() lấy tham số của nó theo tham chiếu nên chúng không thể liên kết với các giá trị tạm thời đó. sử dụng ++a++b hoạt động khi chúng tôi tăng ab sau đó chuyển nó thành trao đổi để không có tạm thời.

1

Chức năng std::swap phải trao đổi các giá trị của hai biến, hay còn gọi là một tài liệu tham khảo giá trị trái. Biểu thức x++ không phải là biến, mà là giá trị hoặc giá trị. Một rvalue không thể bị ràng buộc với một tham chiếu lvalue.

Sự khác biệt giữa một rvalue và một vế trái có thể được giải thích theo cách đó:

int p; 
/* p is left value, 3 is right value, ok */ 
p = 3; 

Nhưng sau đây là không hợp lệ:

/* not ok, 3 is right value */ 
3 = p; 

gì bạn đang gửi đến std::swap hai giá trị của con số này .

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