Tôi không biết làm thế nào để cụm từ câu hỏi rất tốt trong một dòng chủ đề ngắn, vì vậy hãy để tôi thử một lời giải thích dài hơn. Giả sử tôi có các lớp ngoại lệ này:Bạn có thể bắt ngoại lệ theo loại toán tử chuyển đổi không?
class ExceptionTypeA : public std::runtime_error
{
// stuff
};
class ExceptionTypeB : public std::runtime_error
{
// stuff
operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA
};
Tôi có thể làm điều này và kích hoạt khối catch không?
try
{
throw ExceptionTypeB();
}
catch (ExceptionTypeA& a)
{
// will this be triggered?
}
Tôi sẽ đoán rằng nó sẽ không, điều không may, nhưng tôi nghĩ tôi sẽ hỏi, vì tôi không thể tìm thấy bất kỳ thông tin nào trên mạng hoặc trên SO. Và có, tôi nhận ra rằng tôi có thể chạy chương trình trong trình biên dịch của mình và xem điều gì xảy ra, nhưng điều đó sẽ không cho tôi biết tiêu chuẩn nói gì về hành vi này, chỉ là trình biên dịch của tôi thực hiện (và tôi không tin nó).
Phew. Một tiếng thở dài nhẹ nhõm ở đây. – sbi
có bao gồm con trỏ này cho các thành viên không? ví dụ, con trỏ tới dữ liệu thành viên là contravariant, vì vậy 'int (Base :: *)' có thể được chuyển đổi thành 'int (Derived :: *)'. Tôi có thể nắm bắt thứ hai nếu tôi ném cái cũ không? gcc dường như không đồng ý, nhưng từ ngữ tiêu chuẩn là một chút không rõ ràng. – max