goto
hoặc switch
có thể nhảy qua tuyên bố tuyên bố vì nó không có bộ khởi tạo và việc xây dựng là tầm thường - và đối tượng cũng là tầm thường có thể hủy.Khi nhảy qua một tuyên bố, tại sao là cần thiết tầm thường?
Lý do cơ bản cho ràng buộc trên destructor là gì?
struct trivial {
trivial() = default;
~ trivial() = default;
};
struct semi_trivial {
semi_trivial() = default;
~ semi_trivial() noexcept { do_something(); }
};
void foo() {
goto good_label; // OK
trivial foo;
good_label:
goto bad_label; // Error: this goto statement
semi_trivial bar; // cannot jump over this declaration.
bad_label:
std::cout << "hi\n";
}
@Barry Lần đầu tiên 'ngắt;' không bao giờ được thực thi, vì 'i' có giá trị' 2'. Câu hỏi đặt ra là liệu * giây * 'ngắt;' có nên hủy 'st', mặc dù nó không được khởi tạo và không được sử dụng trong câu lệnh' case 2'. Không có từ ngữ đặc biệt để ngăn chặn nó, nó sẽ bị phá hủy, nhưng phá hủy nó có thể không phải là điều đúng đắn để làm. Do đó việc cấm nhảy tới 'trường hợp 2'. – hvd
Ah, vâng. Nên thêm tất cả điều đó vào câu trả lời. – Barry
Cảm ơn! Đọc giữa các dòng, bài báo dường như đang nói rằng destructor sẽ chạy nếu hàm tạo tầm thường được chạy theo lý thuyết. Đối với tôi, nếu đối tượng có thể được sử dụng trong phạm vi, sau đó nó được xây dựng một cách hiệu quả, và destructor chắc chắn sẽ được chạy. Hmmm… – Potatoswatter