Innanzitutto, tenere presente che l'operatore ->
di auto_ptr
viene essenzialmente inoltrato al puntatore contenuto.Così, per questa discussione, il codice in main
diventa equivalente a:
MyClass* ptr = NULL;
cout << ptr->solution() << endl;
Poi notare che i compilatori tendono a implementare funzioni membro in modi che agiscono molto funzioni molto terzi come se fossero con il puntatore this
passato come un altro argomento della funzione. Quindi, dal punto di vista del compilatore corrente, il codice in main
agisce come se fosse:
MyClass* ptr = NULL;
cout << solution(ptr) << endl;
con la soluzione scritta come:
int solution(MyClass* this) { return 42; }
Nel qual caso diventa evidente il motivo per cui non c'era una crash.
Tuttavia come altri hanno già detto, questi sono dettagli interni come compilatori implementano C++, che non sono specificati dal linguaggio standard. Quindi in teoria questo codice potrebbe funzionare come descritto qui su un compilatore, ma si blocca o fa qualcos'altro interamente su un altro compilatore.
Ma in pratica, anche se la norma non garantisce questo comportamento, qualsiasi compilatore particolare potrebbe garantirla, se vogliono. Ad esempio: poiché MFC si basa su questo comportamento, è molto improbabile che Visual Studio smetterà mai di supportarlo. Ovviamente, dovresti ricercare ogni particolare compilatore in cui il tuo codice potrebbe essere usato per assicurarti che effettivamente garantisca questo comportamento.
Il mio consiglio sarebbe di consultare la "Guida galattica per autostoppisti". – NoMoreZealots