我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*/
并重新格式化了代码。现在,我们回到主题:
我无法想到使用相等运算符的合理使用,它允许您修改其by-ref参数。你呢?
答案 0 :(得分:5)
他们很可能忘记了const
。
运算符重载 应该表现一致,而不是执行“超出字符”操作。
作为一般规则,相等运算符永远不应修改它正在比较的任何对象。声明const
在编译器级别强制执行此操作。但是,它经常被遗漏。在C ++中经常忽略“Const正确性”。
答案 1 :(得分:5)
也许类使用延迟初始化的形式。访问数据时,必须进行正确的初始化,并且必须获取数据。这可能会改变班级成员。
但是,可以形成延迟初始化,以便不需要对类进行修改。这可以通过使用Pimpl idiom(通过指向私有类的指针)或使用mutable keyword(不推荐!)来实现。
答案 2 :(得分:2)
你提出的问题会有一个令人困惑的问题。
如果我有两个已经是const的MonitorObjectString
,我就不能使用这个相等的函数。
答案 3 :(得分:1)
在这种情况下,显然没有要求非const args,并且像你一样,我认为它也没有任何一般情况。
然而,正确的情况是,const-correctness问题可以从较低级别的代码中提升,如果你无法将它们更低地纠正,那么你可能不得不在更高层次上解决它们。也许这就是在某些时候发生的事情?
答案 4 :(得分:1)
如果因为修改操作数而无法使用const,那么就会严重误操作运算符重载。
如果你不能使用const,因为实现调用非const函数,你真的应该清理它们,或者至少提供const替代。
如果您正在调用代码,则无法更改哪些不使用const,我仍然使用const,在最深的可用点使用const_cast,并对其进行注释。
正如Shmoopty所指出的那样,运算符的用处远不如它应用,因为它不能用于const对象,即使它们中只有一个是const。不支持“a == 5”的数字相等运算符会大大违反最小惊人法。