Khi tôi đọc tiêu chuẩn C++, có vẻ như mã sau đây là hoàn toàn tốt theo tiêu chuẩn.Tại sao OK để nhảy vào phạm vi của một đối tượng loại vô hướng với trình khởi tạo?
int main() {
goto lol;
{
int x;
lol:
cout << x << endl;
}
}
// OK
[n3290: 6,7/3]: Có thể chuyển thành một khối, nhưng không phải trong một cách không cần qua tờ khai với khởi tạo. Một chương trình mà nhảy từ một điểm mà biến có thời lượng lưu trữ tự động là không nằm trong phạm vi đến điểm nằm trong phạm vi trừ khi biến số có loại vô hướng, loại lớp với giá trị mặc định tầm thường và một destruct tầm thường, một phiên bản cv-đủ điều kiện của một trong các loại hoặc một mảng của một trong các loại trước và được khai báo không có bộ khởi tạo.
Tại sao nó hoạt động? Không phải là nó vẫn còn nguy hiểm để nhảy qua định nghĩa của nó và sử dụng không xác định x
? Và tại sao sự tồn tại của bộ khởi tạo tạo ra bất kỳ sự khác biệt nào?
Nhưng vấn đề là, bất kể có bộ khởi tạo, x không được định nghĩa vì định nghĩa của nó bị bỏ qua. Phải không? –
@EricZ: Định nghĩa vẫn xảy ra. 'goto' là một điều thời gian chạy, nó chỉ bỏ qua hành vi thời gian chạy, như khởi tạo. – GManNickG
@GMan, Đúng vậy! Cảm ơn;) –