Tôi đã gặp một số vấn đề ngoại lệ không rõ ràng với tôi. Trong C++, khi một đối tượng được ném, nó được sao chép lần đầu tiên vào một đối tượng tạm thời, và đối tượng tạm thời sau đó được chuyển tới mã đánh bắt. Bản sao liên quan đến việc sử dụng hàm tạo bản sao lớp của đối tượng. AFAIK, điều này có nghĩa là nếu một lớp có một hàm tạo bản sao riêng, nó không thể được sử dụng như một ngoại lệ. Tuy nhiên, trong VS2010, mã sau đây biên dịch và chạy:Có thể ném đối tượng với các nhà xây dựng bản sao riêng tư không?
class Except
{
Except(const Except& other) { i = 2; }
public:
int i;
Except() : i(1) {}
};
int main()
{
try
{
Except ex1;
throw ex1; // private copy constructor is invoked
}
catch (Except& ex2)
{
assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
}
return 0;
}
Điều này có hợp pháp không?
Hãy thử thêm bản in hoặc gỡ lỗi và xem thứ tự các cuộc gọi, có thể mọi thứ không thực hiện chính xác như bạn nghĩ. – selalerer
Tôi nhận được cùng một hành vi với VS2010 nhưng nó không thành công [ở đây] (http://ideone.com/RlOjl) với gcc v4.3.4. – hmjd
Có thể là đối tượng tạm thời được xây dựng và bản sao được tối ưu hóa. Tương tự như tối ưu hóa giá trị trả lại. –