константная ссылка на временный объект перестает работать после области действия функции (время жизни)
Спрашиваяэтот вопросЯ узнал, что 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
время жизни временного объекта не совпадает с его постоянной ссылкой?