2014-10-16 26 views
7

Tại sao mã này được định dạng đúng? Tôi không chuyển tham chiếu đến hàm này:Truyền số nguyên cho hàm yêu cầu tham chiếu

void function(const int& ref) { 

} 

int main() 
{ 
    function(1); 
} 
+5

'const' trong chữ ký tham số hàm cho phép bạn làm như vậy. Cố gắng bỏ qua nó và bạn sẽ gặp lỗi. –

Trả lời

2

Trình biên dịch có thể tạo tạm thời từ hằng số và thời gian được phép liên kết với tham chiếu const. Nếu tham chiếu không phải là const, điều này sẽ không được cho phép.

+0

Trình biên dịch kém không yêu cầu tham gia cuộc thảo luận này. Nó chỉ làm những gì các quy tắc ngôn ngữ nói với nó :-( –

+0

@KerrekSB Vâng, trình biên dịch có thể tạo tạm thời và liên kết nó với tham chiếu không phải const, nhưng nó sẽ không làm điều đó bởi vì các quy tắc ngôn ngữ bảo nó không. ;) –

6

Tham chiếu giá trị không đổi liên tục có thể liên kết với giá trị. Rvalues, giống như chữ số 1, không có bí danh liên tục, vì vậy nếu bạn sửa đổi nó, bạn sẽ không thể quan sát hiệu ứng, nhưng nếu bạn hứa sẽ không sửa đổi nó (cụ thể là bằng cách truy cập nó thông qua một hằng số) tham khảo), bạn vẫn có thể có mã hoàn toàn hợp lý, và đó là lý do tại sao sự ràng buộc này được cho phép.

(Bạn cũng có thể ràng buộc rvalues ​​để (có thể thay đổi) tài liệu tham khảo rvalue: void function(int &&) Trong trường hợp đó, các tài liệu tham khảo rvalue trở thành (unique) bí danh của giá trị.)

Cũng lưu ý rằng nếu không có quy tắc này nó sẽ không thể khởi tạo biến từ các hàm trả về giá trị gia tăng hoặc sử dụng sao chép-khởi tạo ở tất cả:

struct T { T(int); }; 

T f(); 

T x = 1;  // === "T x = T(1);", copy constructor wants to bind to prvalue 
T x = f(); // ditto 
T x((f())); // ditto 
+0

Tôi không nhận được liên kết "khởi tạo sao chép" cuối cùng này với "có thể liên kết tham chiếu giá trị hằng số với các giá trị". Tôi tin rằng T (int) nên có T (const int &) – Dean

+0

@ user3834459: Không, 'int' không có gì để làm với int của bạn. Giá trị 'T' là giá trị trong ví dụ này. –

+0

Tôi chỉ không hiểu nó như thế nào sao chép-khởi tạo có liên quan đến vấn đề tôi vừa mang – Dean

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