2013-08-16 9 views
6

Xin chào, tôi đang cố gắng tìm ra điều này ..Tại sao một khi tôi đã tuyên bố một tham chiếu như một const thì nó có thể lấy một loại dữ liệu khác?

Giả sử tôi có mã này.

int a = 5; 
double& b = a; //Error. 

Sau đó, khi tôi đã tuyên bố dòng thứ hai là trình biên dịch, trình biên dịch không còn phàn nàn nữa.

const double& b = a; //Correct. 

điều thực sự xảy ra phía sau hiện trường, tại sao const giải quyết được vấn đề.

Trả lời

6

Điều xảy ra đằng sau hậu trường là chuyển đổi ẩn là số int thành gấp đôi. Kết quả của một chuyển đổi tiềm ẩn không phải là một giá trị, do đó, nó không thể được sử dụng để khởi tạo tham chiếu không const .

+0

câu trả lời hay, nhưng bạn có nghĩ chung là những người hỏi về điều này biết định nghĩa của một lvalue không? –

+0

@JohanLundberg, nói chung mọi người có thể tìm thấy một câu hỏi SO khác "lvalue" là gì – RiaD

+0

Đó là một điểm tốt. –

7

An int cần được chuyển đổi thành double trước tiên. Chuyển đổi đó tạo ra một giá trị tạm thời và các giá trị này không thể liên kết với các tham chiếu đến non-const.

Một tham chiếu đến const sẽ kéo dài tuổi thọ của tạm thời mà nếu không sẽ bị phá hủy vào cuối của biểu thức nó đã được tạo ra trong.

{ 
    int a = 0; 
    float f = a; // a temporary float is created here, its value is copied to 
       // f and then it dies 
    const double& d = a; // a temporary double is created here and is bound to 
         // the const-ref 
} // and here it dies together with d 

Nếu bạn đang băn khoăn về một prvalue là, đây là một đẹp SO thread về các loại giá trị.