Questa è una specie di follow-up su Why can't Alexandrescu use std::uncaught_exception() to implement SCOPE_FAIL in ScopeGuard11?C'è qualche trucco per rilevare se un oggetto viene creato durante l'esecuzione di un altro distruttore?
vorrei rilevare se qualcuno sta creando MyClass
nel distruttore di un'altra classe (o con un distruttore attiva da qualche parte nello stack di chiamate).
class MyClass
{
public:
MyClass(){
assert(???what to put here????);
}
}
void f(){
MyClass m; //whether this asserts should be context dependant
}
class OtherClass{
~OtherClass(){
MyClass m; //this should assert
f(); //this should too;
}
}
int main()
{
MyClass m; //this should not assert
f(); //this should also not assert
}
Un tentativo potrebbe essere:
assert(!std::uncaught_exception());
ma che avrebbe funzionato solo se il distruttore viene richiamato a causa di un'eccezione, non se viene richiamato perché l'oggetto è andato fuori del campo di applicazione.
A meno che non progettiate esplicitamente quei distruttori per segnalare comunque la loro esecuzione, dubito che ciò sia possibile. In generale, non puoi dire da dove è stata chiamata la tua funzione. –
Quanto vuoi che sia portatile la soluzione? – Flexo
È possibile specializzare la soluzione su una specifica versione del compilatore ed esaminare lo stack nel costruttore di 'MyClass', per trovare il distruttore di' OtherClass'. Personalmente penso che sia troppo lavoro per quello che è ... e sarà una fonte di errore. – Synxis