const-Verweis auf ein temporäres Objekt wird nach Funktionsumfang (Lebensdauer) unterbrochen
Beim Fragendiese FrageIch habe gelernt, dass ein const-Verweis auf ein temporäres Objekt in C ++ gültig ist:
int main ()
{
int a = 21;
int b = 21;
//error: invalid initialization of non-const reference
//int & sum = a + b;e [...]
//OK
int const & sum = a + b;
return sum;
}
Aber im folgenden Beispiel die const-Referenzrefnop
bezieht sich auf ein zerstörtes temporäres Objekt. Ich wundere mich warum?
#include <string>
#include <map>
struct A
{
// data
std::map <std::string, std::string> m;
// functions
const A& nothing() const { return *this; }
void init() { m["aa"] = "bb"; }
bool operator!= (A const& a) const { return a.m != m; }
};
int main()
{
A a;
a.init();
A const& ref = A(a);
A const& refnop = A(a).nothing();
int ret = 0;
if (a != ref) ret += 2;
if (a != refnop) ret += 4;
return ret;
}
Getestet mit GCC 4.1.2 und MSVC 2010 gibt es 4 zurück;
$> g++ -g refnop.cpp
$> ./a.out ; echo $?
4
gt; g++ -g refnop.cpp
$> g++ -g refnop.cpp
$> ./a.out ; echo $?
4
gt; ./a.out ; echo $?
4
Der Unterschied zwischenref
undrefnop
ist der Aufruf annothing()
das macht eigentlich nichts. Nach diesem Aufruf scheint das temporäre Objekt zerstört zu sein!
Meine Frage:
Warum im Fall vonrefnop
ist die Lebensdauer des temporären Objekts nicht gleich der konstanten Referenz?