Các hành vi đúng là nó phải gây ra một lỗi vì đánh giá lại sẽ thay đổi ý nghĩa:
Ví dụ từ phần 3.3.6:
Phạm vi tiềm năng của một tuyên bố mà kéo dài tới hoặc quá khứ của định nghĩa lớp cũng mở rộng đến các vùng được định nghĩa bởi các định nghĩa thành viên của nó, ngay cả khi các thành viên được định nghĩa bên ngoài lớp (bao gồm định nghĩa thành viên dữ liệu tĩnh, định nghĩa lớp lồng nhau, định nghĩa hàm thành viên (bao gồm phần tử hàm thành viên) , đối với hàm xây dựng (12.1), bộ khởi tạo ctor (12.6.2)) và bất kỳ phần nào của decla phần rator của các định nghĩa như sau theo định danh, bao gồm một mệnh đề khai báo tham số và bất kỳ đối số mặc định nào (8.3.6). [Ví dụ:
Ví dụ tương tự như của bạn (sử dụng enum
thay vì một static const int
):
typedef int c;
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK X::c
char c;
enum { i = 2 };
};
Đồng thời v[i]
đang gặp phải, trình biên dịch chỉ biết về enum { i = 1 };
(hoặc static const int i = 3;
, nhưng khi tuyên bố lớp học đầy đủ được biết, char v[i]
sẽ khác nhau vì i
sẽ được đánh giá lại thành 2
.