我遇到了以下奇怪的行爲,我不知道發生了什麼。重載運營商與空身奇蹟般地工作
我有一個稱爲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
的引用。
這是怎麼回事?
別忘了[鼻魔](https://en.wikipedia.org/wiki/Undefined_behavior) – sp2danny