爲什麼下面的代碼...引用匿名右值已損壞
#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