Các tiêu chuẩn như của N4567 cấm một số loại lại tuyên bố của một tên trước đó đã tuyên bố trong một điều kiện như sau-theo tiêu chuẩn (§3.3.3/4):Tiêu chuẩn có nghĩa là gì bởi "điều kiện tiếp theo của tuyên bố đó"?
Tên khai báo trong for-init-statement, khai báo phạm vi, và trong điều kiện của if, while, for, và các câu lệnh switch là local cho câu lệnh if, while, for, hoặc switch (bao gồm câu lệnh được kiểm soát), và sẽ không được redeclared trong điều kiện tiếp theo của câu lệnh đó cũng như trong khối ngoài cùng (hoặc, đối với câu lệnh if, bất kỳ khối ngoài cùng nào) của câu lệnh được kiểm soát; xem 6.4.
Tuy nhiên, xem xét thực tế rằng đoạn mã sau biên dịch tốt,
int main(void) {
if (int i=10)
if (int i=20)
;
return 0;
}
có vẻ như không rõ ràng cho tôi những gì chính xác "một điều kiện tiếp theo đó tuyên bố" là viết tắt của.
Có lẽ nó đề cập đến tình huống cho 'for':' cho (int i = 0; int i = 1;); '. Có một điều kiện tiếp theo sau khai báo ban đầu của 'i'. Các từ ngữ cho 'if' mặc dù," bất kỳ khối ngoài cùng ", chỉ ra rằng nó xem xét các chi nhánh khác của một' if' là một phần của 'if', vì vậy tôi nghĩ rằng nó cũng có thể đề cập đến' if (int i = 1); nếu if (int i = 1); '. –
Tôi nghĩ rằng nó đang nói về việc tuyên bố một tên hai lần trong cùng một điều kiện. Đó là hai câu lệnh 'if' khác nhau với các điều kiện khác nhau. – Cornstalks
Ah, cấu trúc là 'if (...) stmt; khác stmt', vì vậy tôi không nghĩ rằng ví dụ của tôi với hai ifs phù hợp. "bất kỳ khối ngoài cùng nào" được dự định rõ ràng để tham chiếu đến 'if (int i = 1) {int i = 2; } else {int i = 3; } 'và không cho' if (int i = 1); nếu if (...) {int i = 2; } '(IMO). –