Scott Meyers nói:Nếu một ngoại lệ được ném luôn luôn là một bản sao của đối tượng ngoại lệ, tại sao không phải là hàm tạo bản sao này được gọi?
C++ xác định rằng một đối tượng ném một ngoại lệ như luôn sao chép và sao chép được thực hiện bởi nhà xây dựng bản sao của đối tượng.
Nhưng trong mã của tôi:
struct test
{
test() { cout << "constructor is called" << endl; }
test(const test&) { cout << "copy constructor is called" << endl; }
~test() { cout << "destructor is called" << endl; }
};
void fun()
{
throw test();
}
int main()
{
try {
fun();
}
catch (test& t1) { cout << "exception handler" << endl; }
}
Tôi không thấy constructor sao chép các đối tượng ngoại lệ của được gọi.
Nếu tôi thay đổi catch
để nhận đối tượng ngoại lệ theo giá trị thì đúng vậy, nhưng theo lời Meyers, đối tượng ngoại lệ phải được sao chép ngay cả khi nó được nhận bằng tham chiếu.
Tại sao trình tạo bản sao không được gọi (ngay cả khi xử lý ngoại lệ được thực hiện theo tham chiếu)?
Câu hỏi của bạn là gì? – cdeszaq
Câu hỏi là "đó là sai: Meyers hoặc trình biên dịch của tôi?" Đừng đóng câu hỏi chỉ vì bạn không hiểu chúng. –