C
wer es nachlesen will: 12.2/5
zwar können temporaries an referenzen auf const gebunden werden (und referenzen auf non-const im falle von non-const lvalue temporaries - wie beim fangen von exceptions) - aber im falle von member-referenzen verlängert das die lebensdauer der temporaries nur bis zum ende des konstruktors. der grund dafür ist relativ simpel: im falle von lokalen oder statischen referenzen exisitiert die referenz im selben scope wie das temporäre objekt - d.h. wenn der block verlassen wird, steht definitiv fest, dass diese an ein temporäres objekt gebunden ist - folglich ist es für den compiler sehr einfach, an dieser stelle den destruktor des temporären objekts aufzurufen. im falle des bindens an memberreferenzen geht das nicht. wenn der destruktor des objekts, das die referenz enthält, verlassen wird, fehlt dem compiler der kontext. er kann dann nicht wissen, wie das objekt, an das die referenz gebunden ist, erzeugt wurde - es könnte ein temporäres objekt gewesen sein, oder auch nicht. aber nur im ersteren falle würden wir das objekt zerstören wollen. der compiler müsste also zusätzliche infomationen speichern - und es würde weitaus schwieriger vorauszusagen - was beim ausführen des destruktors passiert. mit der regel, so wie sie ist dagegen, wissen wir stets, dass beim zerstören von memberreferenzen nichts passiert. kleines beispiel:
#include <vector>
#include <ctime>
#include <cstdlib>
struct Bar {};
struct Foo
{
const Bar& bar_;
Foo(const Bar& bar) : bar_( bar ) {}
};
int main()
{
using namespace std;
srand( time( 0 ) );
Bar b;
vector< Foo > v;
for ( int i = 0; i < 10; ++i )
v.push_back( rand() % 2 ? Foo( b ) : Foo( Bar() ) );
}
verlängerung dre lebenszeit von temporaries bis zum destruktor des objekts, das die referenz enthält, würde die sache im destruktor doch wesentlich komplizierter machen.