2011-12-16 11 views
6

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?

Trả lời

7

Bạn muốn sử dụng một số chưa được khởi tạo x dù sao, kể từ int x; là chưa được khởi tạo vì nó sẽ nhận được. Sự tồn tại của một initializer làm cho tất nhiên một sự khác biệt, bởi vì bạn muốn bỏ qua nó. int x = 5; ví dụ khởi tạo x, vì vậy nó sẽ tạo sự khác biệt nếu bạn nhảy qua nó hay không.

+0

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? –

+0

@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

+0

@GMan, Đúng vậy! Cảm ơn;) –

2

Vẫn còn nguy hiểm khi nhảy qua định nghĩa của nó và sử dụng chưa được khởi tạo x?

Tuy nhiên, x sẽ không được khởi tạo vì nó được khai báo mà không cần khởi tạo! Vì vậy, goto có thể bỏ qua các câu lệnh gán được đặt (sắp xếp-khởi tạo) x, nhưng không ngạc nhiên khi goto có thể bỏ qua các câu lệnh gán; và bản thân tờ khai không thực sự là làm mọi thứ trừ khi có bộ khởi tạo.

+1

+1 * bản thân tuyên bố không thực sự làm gì cả *. Đó là điểm mấu chốt. Không có bộ khởi tạo, không có mã nào được tạo. Các quy tắc đảm bảo rằng bạn không thực sự bỏ qua bất kỳ mã nào. –

+0

@Ernest, tôi tò mò làm thế nào x được định nghĩa bởi vì định nghĩa của nó đã qua đời? –

+2

Hãy tưởng tượng rằng thanh ghi bộ xử lý miễn phí được chỉ định để giữ 'x'. Đó chỉ là sổ sách kế toán trong trình biên dịch; không có gì về mặt vật lý trong mã được tạo ra có nội dung "Đăng ký 17 giờ là' x'. " Bây giờ, nếu 'x' được khởi tạo, chúng ta sẽ có mã để đặt giá trị của sổ đăng ký - nhưng như chúng ta đã nói, không có cái nào trong số đó. –