2008-12-19 25 views
1

this post,我已經看到了這一點:的==操作符,它的參數是非常量引用

class MonitorObjectString: public MonitorObject { 
    // some other declarations 
    friend inline bool operator==(/*const*/ MonitorObjectString& lhs, 
            /*const*/ MonitorObjectString& rhs) 
    { return lhs.fVal==rhs.fVal; } 
} 

之前,我們可以繼續下去,這一點非常重要:

  • 不詢問任何人的代碼能力。
  • 我是只是想知道爲什麼有人會在比較中需要非const引用。
  • that question的海報沒有寫的代碼。

這只是爲了以防萬一。這一點也很重要:

  • 我加了/*const*/ s並重新格式化了代碼。

現在,我們回到正題:

我想不出一個理智的使用等於運算符,可以讓你修改其副裁判爭論的。你做?

回答

5

也許這些類使用一種延遲初始化的形式。訪問數據時,必須進行正確的初始化,並且必須提取數據。這可能會改變班級成員。

但是,可以形成延遲初始化,以便不需要修改類。這可以通過使用Pimpl idiom(通過指向私有類的指針)或使用mutable keyword(不推薦!)來完成。

+0

或者可能會改變的類成員可能被聲明爲'mutable`。 – pyon 2008-12-19 15:50:47

+0

@Eduardo,C++?你能否詳細說明一下? – strager 2008-12-19 15:50:47

4

很可能他們忘了const。 操作員超負荷應該行爲一致,不執行「不符合規定」的行爲。

作爲一般規則,等號運算符不應該修改它所比較的​​任何對象。聲明const在編譯器級執行此操作。但是,它經常被忽略。 C++中常常忽略「Const正確性」。

1

在這種情況下顯然沒有非常量參數的要求,並且像你一樣,我也不認爲它有任何一般情況。

但是,常量正確性問題肯定會從代碼的較低級別推出,如果不能將它們糾正爲低級,那麼您可能需要更高級地解決它們。也許這就是在這裏發生的一些事情?

2

您提出的問題有一個更令人困惑的問題。

如果我有兩個已經是const的MonitorObjectString,我不能使用這個相等函數。

1

如果因爲修改操作數而無法使用const,那麼會嚴重地誤用操作符重載。

如果你不能使用const,因爲實現調用非const函數,你應該清理它們,或者至少提供const選項。

如果你正在調用代碼,你不能改變哪些不使用const,我會使用常量const,在最深的可用點使用const_cast,並對它進行註釋。

正如Shmoopty指出的那樣,該運算符比它應該少很多,因爲它不能用於const對象,即使其中只有一個是const。不支持「a == 5」的數字相等運算符會大大違反最小驚訝定律。

相關問題