Trước tiên, hãy nhớ rằng toán tử ->
của auto_ptr
về bản chất được chuyển tiếp đến con trỏ chứa.Vì vậy, để thảo luận này, mã của bạn trong main
trở nên tương đương với:
MyClass* ptr = NULL;
cout << ptr->solution() << endl;
Sau đó, lưu ý rằng trình biên dịch có xu hướng để thực hiện chức năng thành viên theo cách mà hành động rất nhiều chức năng như thể chúng là phi thành viên với con trỏ this
thông qua như là một đối số hàm. Vì vậy, từ thời điểm biên dịch hiện tại của bạn xem, mã của bạn trong main
hành vi như thể nó là:
MyClass* ptr = NULL;
cout << solution(ptr) << endl;
với giải pháp viết như sau:
int solution(MyClass* this) { return 42; }
Trong trường hợp này, nó trở nên rõ ràng lý do tại sao không có một tai nạn.
Tuy nhiên như những người khác đã đề cập, đây là chi tiết nội bộ về cách trình biên dịch triển khai C++, không được chỉ định theo tiêu chuẩn ngôn ngữ. Vì vậy, trong lý thuyết mã này có thể làm việc như mô tả ở đây trên một trình biên dịch nhưng sụp đổ hoặc làm điều gì đó hoàn toàn khác trên trình biên dịch khác.
Nhưng trong thực tế, ngay cả khi tiêu chuẩn không đảm bảo hành vi này, bất kỳ trình biên dịch cụ thể nào đều có thể đảm bảo nếu chúng muốn. Ví dụ: vì MFC dựa vào hành vi này, rất khó có khả năng Visual Studio sẽ ngừng hỗ trợ nó. Tất nhiên, bạn sẽ phải nghiên cứu từng trình biên dịch cụ thể nơi mã của bạn có thể được sử dụng để đảm bảo rằng chúng thực sự đảm bảo hành vi này.
Lời khuyên của tôi là tham khảo "Hướng dẫn về Thiên hà của Hitchhiker". – NoMoreZealots