一个operator ==,其参数是非const引用

时间:2008-12-19 15:39:25

标签: c++ operators const equals-operator

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*/并重新格式化了代码。

现在,我们回到主题:

我无法想到使用相等运算符的合理使用,它允许您修改其by-ref参数。你呢?

5 个答案:

答案 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”的数字相等运算符会大大违反最小惊人法。