Consideriamo un banco di prova piccola unitàrisoluzione del riferimento e ritorno con riferimento
struct A
{
virtual void func(){}
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
};
int main()
{
A obj = obj.foo();
}
Adiacente 1
è vero implementazione definita/non specificato che la deferenza non sarebbe accaduto, come stiamo tornando per riferimento e il programma non potrebbe andare in crash se un l'accesso esplicito all'oggetto puntato non è fatto?
ho avuto discussione con uno dei miei colleghi in cui ha ricordato che il compilatore, nella maggior parte dei casi, sarebbe ottimizzare la risoluzione del riferimento di obj
come stiamo tornando per riferimento e questo codice non potrebbe andare in crash?
Grazie
La mia comprensione è: il compilatore non è obbligato a 1) eseguire codice che non accada nulla 2) eseguire codice che produce un comportamento indefinito: http://blog.llvm.org/2011/05/what-every- c-programmer-should-know_14.html – Patashu
Anche io credo che il comportamento non sia definito e non dovremmo fare affidamento sull'implementazione sottostante in questo caso. –
È un comportamento indefinito e non dovresti mai fare affidamento su comportamenti indefiniti facendo ciò che pensi che farà, sì. Ma non si romperà necessariamente, se il compilatore decide che è un codice morto o indefinito e non vale la pena produrre codice, parlando da una prospettiva accademica. – Patashu