2010-02-26 19 views
7

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ó).

Trả lời

13

Bạn không thể. Standardese tại 15.3/3:

Một handler là một trận đấu cho một đối tượng ngoại lệ của loại E nếu

  • Việc xử lý là loại cv T hoặc cv T& và E và T là cùng loại (bỏ qua các từ trên mức CV- vòng loại), hoặc
  • xử lý là loại cv T hoặc cv T& và T là một lớp cơ sở công cộng rõ ràng của E, hoặc
  • xử lý là loại cv1 T* cv2 và E là một loại con trỏ có thể được chuyển đổi sang các loại hình xử lý bởi một trong hai hoặc cả hai
    • chuyển đổi con trỏ chuẩn (4.10) không liên quan đến chuyển đổi để trỏ đến private hay protected hoặc lớp mơ hồ
    • chuyển đổi bằng cấp

kịch bản của bạn mong muốn phù hợp không ai trong số này. cv có nghĩa là "kết hợp const và/hoặc biến động"

+1

Phew. Một tiếng thở dài nhẹ nhõm ở đây. – sbi

+0

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

Các vấn đề liên quan