{ // Block scope Foo fooVal = makeFoo(); // Say makeFoo() returns a (temporary, unnamed) Foo // Here the temporary Foo is dead (fooVal is a copy). // Foo &fooRef = makeFoo(); // Error, reference is non-const Foo const &fooCRef = makeFoo(); // All good // ... // The second temporary is still alive fooCRef.doSomethingFunny(); // Works like a charm ! } // The second temporary dies with fooRef //------------------------------------------ Foo *fooPtr = new Foo; // Here is a Foo Foo &fooRef = *fooPtr; // Here is an alias for that Foo delete fooPtr; // Here is the end of that Foo's life fooRef.doSomethingFunny(); // Here comes trouble...