为什么下面的代码...引用匿名右值已损坏
#include <iostream>
#include <map>
template< typename T, typename U >
class Map
{
public:
Map(const T& t, const U& u) { map_[ t ] = u; }
Map< T, U >& operator() (const T& t, const U& u)
{
map_[ t ] = u;
return *this;
}
U& operator[] (const T& t) { return map_[ t ]; }
private:
std::map< T, U > map_;
};
Map< int, std::string >& g_map = Map< int, std::string> (1, "lorem")
(3, "ipsum")
(5, "dolor");
int main(int argc, char* argv[])
{
std::cout << g_map[3] << std::endl;
return 0;
}
......产生这种损坏的输出?...
>g++ -g main.cpp
>./a.out
ipsumÿÿÿÿlorem!h€Ap€AD€A!ˆ€A¼gì¿P€A€A,€A!p€A€AY
我了解到最近,分配给一个参考一个匿名的右值扩展了右值对象的生命周期。所以我认为由于匿名权值std::map
被全局范围g_map
引用,所以它的生命周期将被扩展到全局范围变量的范围,并且将g_map
作为任何其他全局变量(如果不是作为参考,匿名右值将在结束分号处死亡)。
有人可以解释一下终生延长规则是如何适用于上述的吗?
使用gcc编译4.9.2。
[Works for me](http://rextester.com/HTWI33012),它的价值。 –
啊,我知道发生了什么事。你的程序表现出未定义的行为:'g_map'是一个悬而未决的参考。 –
@StoneThrow MS VS当然,只有该编译器允许临时隐式转换为左值 – Slava