Dies ist eine Art von Follow-up auf Why can't Alexandrescu use std::uncaught_exception() to implement SCOPE_FAIL in ScopeGuard11?Gibt es einen Trick, ob ein Objekt während der Ausführung eines anderen Destruktors erstellt wird?
Ich möchte jemanden erkennen, ob sich MyClass
im Destruktor einer anderen Klasse (oder mit einem aktiven destructor irgendwo in den Call-Stack) zu schaffen.
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
}
Ein Versuch könnte sein:
assert(!std::uncaught_exception());
aber das würde nur funktionieren, wenn der destructor wegen einer Ausnahme aufgerufen wird, nicht, wenn es aufgerufen wird, weil das Objekt des Gültigkeitsbereich ging.
Wenn du diese Destruktoren nicht explizit designierst, um ihre Ausführung irgendwie zu signalisieren, bezweifle ich, dass das möglich ist. Im Allgemeinen können Sie nicht sagen, woher Ihre Funktion aufgerufen wurde. –
Wie tragbar soll die Lösung sein? – Flexo
Sie können Ihre Lösung auf eine bestimmte Compiler-Version spezialisieren und den Stack im Konstruktor von 'MyClass' untersuchen, um den Destruktor von' OtherClass' zu finden. Ich persönlich denke, es ist viel zu viel Arbeit für das, was es ist ... und wird eine Fehlerquelle sein. – Synxis