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 vonrefnopist die Lebensdauer des temporären Objekts nicht gleich der konstanten Referenz?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage