Tôi ngạc nhiên phát hiện ra ngày hôm nay rằng đoạn mã sau là hoàn toàn hợp lệ (gcc 4.4.5):trường hợp thú vị của shadowing tham số C++ (tham số không shadowed trong khối lệnh if)
int get_int(const int& i)
{
if(i == 0)
{
int i = 1;
return i;
}
return i;
}
Tôi thực sự ngạc nhiên. Nếu tôi phải chấp nhận nó, thì chắc chắn tôi có thể nói rằng nó có ý nghĩa bởi vì biến mới nằm trong khối riêng của nó, vì vậy phần còn lại của mã bên ngoài vẫn có thể truy cập tham số, vì vậy tham số không thực sự bị che khuất. Nhưng nó vẫn không có ý nghĩa với tôi tại sao chúng ta không làm cho cú pháp này không hợp lệ? Tôi thấy không có lợi ích cho phép điều này, và trên thực tế, tôi chỉ cần đào sâu vào một lỗi gây ra bởi điều này. Đó là một hàm dài và tôi tạo biến của riêng mình mà không nhận ra nó có cùng tên như tham số và một số dòng mã sau (cùng một khối) có sự phụ thuộc vào biến thông số rất lớn đó và hiện tại nó đang sử dụng phiên bản của tôi và có một giờ trong ngày của tôi.
Tôi có kiến thức rất bề ngoài về trình biên dịch, vì vậy ai đó có thể giải thích cho tôi toàn bộ câu chuyện đằng sau hành vi này? Như một so sánh, trong mã Java như thế này là không hợp lệ (biến trùng lặp).
Không phải là một chuyên gia trong trình biên dịch, nhưng tôi sẽ nghi ngờ thực tế rằng đối số là một int & và biến "bóng" chỉ là một int được trong vòng lặp ở đây. –
Tôi cũng đã cố gắng 'get_int (int i)' nó làm cho không có sự khác biệt – user1861088
Phạm vi của 'int i' là khối trong đó nó được khai báo. Điều này đổ bóng các tham số bên trong khối, nhưng không phải bên ngoài nó. Nếu bạn đang hỏi "Tại sao một biến được dàn vào khối thay vì hàm?" câu trả lời là "Đó là những gì các quy tắc ngôn ngữ nói." Các ngôn ngữ khác nhau tuân theo các quy tắc khác nhau. Đó là những gì làm cho chúng khác nhau. –