константная ссылка на временный объект перестает работать после области действия функции (время жизни)

Спрашиваяэтот вопросЯ узнал, что const ссылка на временный объект действительна в C ++:

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;
}

Но в следующем примере константная ссылкаrefnop относится к разрушенному временному объекту. Интересно, почему?

#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;
}

Протестировано с использованием GCC 4.1.2 и MSVC 2010, возвращается 4;

$> 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

Разница междуref а такжеrefnop это призыв кnothing() который действительно ничего не делает. Кажется, после этого вызова временный объект уничтожен!

Мой вопрос:
Почему в случаеrefnopвремя жизни временного объекта не совпадает с его постоянной ссылкой?

Ответы на вопрос(2)

Ваш ответ на вопрос