Mã này dẫn đến hành vi undefined:Goto và destructors có tương thích không?
void some_func() {
goto undefined;
{
T x = T();
undefined:
}
}
Các nhà xây dựng không được gọi.
Nhưng còn mã này thì sao? Liệu destructor của x được gọi là? Tôi nghĩ rằng nó sẽ được, nhưng tôi muốn chắc chắn. :)
void some_func() {
{
T x = T();
goto out;
}
out:
}
Mẫu mã đầu tiên không dẫn đến hành vi không xác định, nó là bất hợp pháp và sẽ không biên dịch. –
"không biên dịch" là một ví dụ về hành vi không xác định, tôi nghĩ vậy. Cuốn sách tôi đang đọc nói "hành vi không xác định". –
Hai kỹ thuật khác nhau: nếu trình biên dịch là cần thiết để từ chối chương trình, đó là "ít xấu" từ POV của lập trình viên hơn là một cái gì đó có thể biên dịch và thiết lập nhà của mình trên lửa khi nó chạy. Một số trình biên dịch từ chối những thứ hợp pháp nhưng trình biên dịch đó biết sẽ không xác định. –