Làm thế nào để ném và bắt ints hoạt động?


14

Với mã này:

int main()
{
    try
    {
        throw -1;
    }
    catch (int& x)
    {
        std::cerr << "We caught an int exception with value: " << x << std::endl;
    }
    std::cout << "Continuing on our merry way." << std::endl;

    return 0;
}

Chúng ta có:

/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1

Làm thế nào để catchkhối đọc -1int&? Chúng tôi không thể gán giá trị cho tham chiếu lvalue không const.

Và tại sao std::coutcâu lệnh thứ hai được thực thi trước std::cerrcâu lệnh đầu tiên ?


2
Bạn có chắc chắn đây là đầu ra chính xác mà bạn nhận được? Các We caught an int exception with value: -1dòng nên được in đầu tiên.
HolyBlackCat

1
@Scheff, Xin lỗi bạn đã đúng, Đầu ra đầu tiên được chuyển hướng đến error streamkhông standard stream.
Ghasem Ramezani


2
@ FrançoisAndrieux Lý do nó được cho phép là có những ngữ nghĩa khác nhau đang diễn ra. Nói chung với tạm thời bạn không biết điều gì sẽ xảy ra với nó nên đã quyết định chỉ cho phép các tham chiếu const đến tạm thời. Với các ngoại lệ, chúng tôi biết thời gian tồn tại của đối tượng và chúng tôi có thể muốn sửa đổi nó và đưa nó trở lại bối cảnh cao hơn. Để tạo điều kiện cho điều đó, tiêu chuẩn cho phép liên kết với một tham chiếu giá trị không const.
NathanOliver

1
@ FrançoisAndrieux throwtạo một bản sao (hoặc di chuyển) đối tượng bạn truyền cho nó. Các tài liệu tham khảo liên kết với bản sao đó. Nó có ý nghĩa rằng bản sao là một giá trị.
HolyBlackCat

Câu trả lời:


10

Điều này không sao vì [trừ.throw] / 3

Ném một bản sao ngoại lệ - khởi tạo ([dcl.init], [class.copy.ctor]) một đối tượng tạm thời, được gọi là đối tượng ngoại lệ. Một giá trị biểu thị tạm thời được sử dụng để khởi tạo biến được khai báo trong trình xử lý khớp ([trừ.handle]).

nhấn mạnh của tôi

Như bạn có thể thấy, mặc dù là tạm thời, trình biên dịch coi nó như một giá trị để khởi tạo trình xử lý. Bởi vì điều này, bạn không cần một tài liệu tham khảo const.


1
Nhưng những gì với thứ tự xuất hiện các tin nhắn?
Tomáš Zato - Phục hồi Monica

8

Từ tài liệu tham khảo nàythrow :

Không giống như các đối tượng tạm thời khác, đối tượng ngoại lệ được coi là đối số lvalue khi khởi tạo tham số mệnh đề bắt, do đó nó có thể bị bắt bởi tham chiếu lvalue, sửa đổi và truy xuất lại.

Vì vậy, trong khi "đối tượng" là tạm thời, nó vẫn là một giá trị và như vậy bạn có thể bắt nó bằng cách tham chiếu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.