2012-04-13 22 views
0

我明白了,或者至少有一個想法,爲什麼下面的代碼不工作:C++,從函數調用分配給類實例?

class Spambar { 
    public: 
     Spambar() {}; 
     Spambar(Spambar& sb) {}; 

     Spambar operator + (Spambar sb) { 
      Spambar new_sb; 
      return new_sb; 
     } 
}; 

int main() { 
    Spambar sb1; 
    Spambar sb2; 
    Spambar sb3 = sb1 + sb2; // <<< Error: "No matching function for call to ... " 
} 

我想,問題是,拷貝構造函數需要一個Spambar實例的引用。由於沒有引用,而是返回一個淺層實例,所以編譯失敗。

那麼,我該怎麼做到這一點?

+0

複製構造函數以及'operator +'應該對操作數確實有一個'const Spambar&'。 – 2012-04-13 16:12:55

+0

而問題,爲什麼它不工作,是因爲它沒有任何東西。或者這不是真正的代碼? – 2012-04-13 16:14:00

回答

3

問題是sb1 + sb2的結果是暫時的;用於初始化sb3的複製構造函數需要非const引用;並且您不能將非const參考引用到臨時。

你幾乎可以肯定想通過將構造函數的參數類型更改爲Spambar const &來解決這個問題。當你在它,你幾乎應該做同樣的operator+,也使運營商本身const

Spambar(Spambar const &); 
Spambar operator + (Spambar const &) const; 

如果你正在做的事情很奇怪,居然想拷貝構造函數修改它的論點,那麼你將不得不避免將臨時對象傳遞給它,或者做一些討厭的hackery mutableconst_cast。在C++ 11中,你可以使用一個移動構造函數,參數類型爲Spambar &&

2

您的課程沒有采用const參考的複製構造函數。通常情況下,一個拷貝構造函數的樣子:

Spambar(const Spambar&); 

告訴你只有非常罕見的情況下被使用的形式,它可能是防止你的代碼工作。

+2

具體而言,_reason_不起作用的是'operator +'的直接結果是一個右值,並且右值不能綁定到非常量左值引用。 – ildjarn 2012-04-13 16:13:22

+0

Ahhhh沒錯。我記得。 :)無論如何,我不明白'const'關鍵字在用「人類術語」表達時做了什麼。成員函數'operator +'返回的值是否爲常量,或者爲什麼現在可以工作? //編輯:謝謝@ildjarn ^^ – 2012-04-13 16:14:47

+0

哦,我認爲它不起作用的原因是因爲它具有函數體的{}。 – 2012-04-13 16:15:15