2013-09-02 31 views
11

Tại sao bạn có thể làm điều nàyNon const vế trái tài liệu tham khảo

int a; 
const double &m = a; 

Nhưng khi bạn làm điều này

int a; 
double &m = a; 

bạn gặp lỗi?

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int' 

Edit:

Để cụ thể hơn Tôi cố gắng để hiểu được lý do tài liệu tham khảo không const không thể ràng buộc đối tượng tạm thời.

+0

Câu hỏi này có thể được diễn giải theo một trong hai cách: hoặc bạn cần biết rằng có quy tắc cho phép tham chiếu const ràng buộc với giá trị tạm thời hoặc bạn muốn biết lý do tại sao. Có thể bạn sẽ nhận được cả hai loại câu trả lời, nhưng bạn có khả năng chỉ quan tâm đến một trong số đó ... đó là gì? – DanielKO

+0

Tôi muốn biết lý do. – Ares

+1

Thông báo lỗi ở đây hơi khó hiểu. Tôi mong đợi một số điều như - 'lỗi: khởi tạo không hợp lệ tham chiếu không const của loại‘ double & ’từ giá trị rvalue của loại‘ double ’. – Mahesh

Trả lời

12

Đó là vì tạm thời không thể liên kết với tham chiếu không phải const.

double &m = a; 

a là loại int và đang được chuyển đổi sang double. Vì vậy, tạm thời được tạo ra. Tương tự là trường hợp cho các loại do người dùng định nghĩa.

Foo &obj = Foo(); // You will see the same error message. 

Nhưng trong Visual Studio, nó hoạt động tốt vì mở rộng trình biên dịch được bật theo mặc định. Nhưng GCC sẽ phàn nàn.

3

Bởi vì việc sửa đổi tạm thời là vô nghĩa, C++ không muốn bạn ràng buộc tham chiếu không const vào tạm thời. Ví dụ.

int a; 
double &m = a; // caution:this does not work. 

Điều gì sẽ xảy ra nếu nó hoạt động? a thuộc loại int và đang được chuyển đổi thành gấp đôi. Vì vậy, tạm thời được tạo ra.

Bạn có thể sửa đổi m, bị ràng buộc tạm thời nhưng hầu như không có gì xảy ra. Sau khi sửa đổi, biến a không thay đổi (điều gì tệ hơn, bạn có thể nghĩ rằng a đã thay đổi, điều này có thể gây ra sự cố).

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