A mio parere, il seguente codice (da qualche domanda C++) dovrebbe portare a UB, ma sembra che non lo sia. Ecco il codice:Richiama esplicitamente il risultato del distruttore nel comportamento non definito qui?
#include <iostream>
using namespace std;
class some{ public: ~some() { cout<<"some's destructor"<<endl; } };
int main() { some s; s.~some(); }
e la risposta è:
some's destructor
some's destructor
ho imparato modulo C++ faq lite che non dovremmo chiamare esplicitamente distruttore. Penso che dopo la chiamata esplicita al distruttore, l'oggetto s debba essere cancellato. Il programma chiama automaticamente il distruttore al termine, dovrebbe essere UB. Tuttavia, l'ho provato su g ++ e ho ottenuto lo stesso risultato della risposta di cui sopra.
È perché la classe è troppo semplice (nessuna nuova/eliminazione coinvolta)? O non è affatto UB in questo caso?
L'intero punto di * comportamento non definito * è che è ** non definito **. Il fatto che "lavori" è solo una delle infinite possibilità. – ereOn
Questo distruttore è troppo semplice per avere effetti dannosi. Credo che chiamare il distruttore non sia un caso particolare, ma semplicemente chiamare un metodo della classe. Ha il caso speciale di essere chiamato a destra prima di essere deallocato (da delete o scope exit). –
@ereOn: Grazie. Capisco che "lavori" in g ++ non significa che non sia "indefinito". Tuttavia, la risposta online (che potrebbe non essere corretta) NON è UB, è per questo che sono confuso. – EXP0