2010-02-24 41 views
14

我有這樣的代碼示例:鑄造運營商 - 常量VS非const

class Number 
{ 
    int i; 
    public: 
    Number(int i1): i(i1) {} 
    operator int() const {return i;} 
}; 

什麼是從鑄造運營商移除const改性劑的影響? 它會影響自動投射,爲什麼?

回答

28

如果轉換操作符是不是常量,你不能轉換const對象:

const Number n(5); 
int x = n; // error: cannot call non-const conversion operator 
+1

+1 - 很好賺。嗯 - 我想轉換從const對象中取得的值,但我不能,因爲轉換(即不修改源值)不是常量。停下來,看看,思考,推理是顯而易見的 - 這與任何其他方法沒有什麼不同。但我仍然聽到那個暮光之城的主題。源的(至少邏輯的)恆定性是該方法的預期行爲的一部分 - 「轉換」意味着什麼。但是再一次,一致的規則至少是一致的。 – Steve314 2010-02-24 10:46:47

5

無論class Number實例是否爲const,都可以調用const版本。如果運算符被聲明爲非const,那麼它只能在非常量實體上調用 - 當你試圖在不能被調用的地方隱式地使用它時,你會得到一個編譯錯誤。

+0

你的意思是「只在*非const *實體上調用?」? – legends2k 2010-02-24 11:00:51

+0

@ legends2k:是的,已修復。謝謝。 – sharptooth 2010-02-24 11:24:56

5

如果你有這樣的功能:

void f(const Number& n) 
{ 
    int n1 = n; 
} 

它會開始,如果你給編譯錯誤在cast操作符中刪除const。