2015-09-04 56 views
0

我遇到了以下奇怪的行爲,我不知道發生了什麼。重載運營商與空身奇蹟般地工作

我有一個稱爲mvec的矢量類,它將實際值存儲在一個數組中,而類mvec_transf是另一個矢量的轉換。它存儲對另一個向量的引用,以及定義轉換的一元函數。這是它如何被使用:

mvec<int, 3>        vec1 {1, 2, 3}; 
mvec_transf<mvec<int, 3>, std::negate<int>> vec2 {vec1, std::negate<int>()}; 
// `vec2` contains [-1 -2 -3] 

我重載operator-,這樣我可以寫auto vec2 = -vec1;,這是我目前的執行:

template <class Vec_t> 
mvec_transf<Vec_t, std::negate<typename Vec_t::elem_t>> 
operator- (Vec_t& v) 
{ /*std::out << "Hello from operator- " << std::endl;*/ } 

令人不解,這個實現(無體)的作品。如果我註釋掉這個定義,我會得到一個與編譯器的operator-錯誤不匹配。如果我不這樣做,代碼將編譯爲缺少返回類型未使用變量'v'。當我運行auto vec2 = -vec1時,vec2實際上包含一個正在工作的mvec_transf<..>對象,它具有對vec1的正確引用。

通過添加打印語句,我可以確認實際上被調用的重載操作符。但是,在打印聲明中,vec2包含對垃圾的引用,而不是對vec1的引用。

這是怎麼回事?

回答

4

你有什麼只是未定義的行爲。來自[stmt.return]:

在函數末尾流動相當於沒有值的返回;這會導致值返回函數中的未定義行爲。

一種未定義的行爲是神奇的工作代碼。另一種類型是魔法破壞你的硬盤代碼。我不會依賴它神奇地工作很長時間。修理它!

+0

別忘了[鼻魔](https://en.wikipedia.org/wiki/Undefined_behavior) – sp2danny