Betrachten Sie eine kleine Einheit TestfallDereferenziere und Rückkehr durch Verweis
struct A
{
virtual void func(){}
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
};
int main()
{
A obj = obj.foo();
}
In Zeile 1
ist es Implementierung definiert/nicht spezifiziert, dass die Ehrerbietung nicht passieren würde, wie wir durch Bezugnahme zurückkehren und das Programm würde nicht abstürzen, wenn ein expliziter Zugriff auf das auf Objekt verwiesen wird nicht gemacht?
Ich hatte Streit mit einem meiner Kollegen, wobei er erwähnt, dass der Compiler in den meisten Fällen die Dereferenz von obj
optimieren würde, wie wir es per Referenz zurückgeben und dieser Code würde nicht abstürzen?
Dank
Mein Verständnis ist: Der Compiler ist nicht verpflichtet, 1) Code auszuführen, der nichts passiert 2) Code ausführen, der ein undefiniertes Verhalten erzeugt: http://blog.llvm.org/2011/05/what-every- c-programmer-sollte-wissen_14.html – Patashu
Auch ich glaube, das Verhalten ist nicht definiert und wir sollten uns in diesem Fall nicht auf die zugrunde liegende Implementierung verlassen. –
Es ist undefiniertes Verhalten und Sie sollten sich nie auf undefiniertes Verhalten verlassen, was Sie tun, was Sie denken, ja. Aber es wird auch nicht unbedingt zum Absturz kommen, wenn der Compiler entscheidet, dass es sich um einen toten Code oder um einen undefinierten Code handelt, für den aus akademischer Perspektive kein Code produziert werden sollte. – Patashu