2

这个帖子,我看过这个:

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

在我们继续之前,这非常重要:

  • 不是在质疑任何人的编码能力。
  • 只是想知道为什么有人在比较中需要非常量引用。
  • 问题的发布 者没有编写该代码。

这是以防万一。这也很重要:

  • 我添加了/*const*/s 并重新格式化了代码。

现在,我们回到主题:

我想不出一个可以让您修改其按引用参数的等式运算符的合理使用。你?

4

5 回答 5

5

他们很可能忘记了const. 运算符重载应该表现一致,而不是执行“不合时宜”的操作。

作为一般规则,相等运算符永远不应该修改它正在比较的任何对象。声明const在编译器级别强制执行此操作。然而,它经常被遗漏。“常量正确性”在 C++ 中经常被忽视。

于 2008-12-19T15:44:34.360 回答
5

也许这些类使用了一种惰性初始化形式。当访问数据时,必须进行适当的初始化,并且必须提取数据。这可能会改变班级成员。

但是,可以形成延迟初始化,这样就不需要对类进行修改。这可以通过使用Pimpl 习惯用法(通过指向私有类的指针)或使用mutable 关键字(不推荐!)来完成。

于 2008-12-19T15:45:58.290 回答
2

你提出的问题有一个更令人费解的问题。

如果我有两个MonitorObjectStrings 已经是 const,我就不能使用这个相等函数。

于 2008-12-19T17:00:32.850 回答
1

在这种情况下,显然不需要非常量参数,并且像您一样,我也不认为有任何一般情况。

但是,const 正确性问题肯定会从较低级别的代码向上推,如果您不能从低层纠正它们,那么您可能不得不在更高层解决它们。也许这就是这里发生的事情?

于 2008-12-19T15:45:36.357 回答
1

如果您因为修改操作数而不能使用 const,那么您就严重滥用了运算符重载。

如果你不能使用 const 因为实现调用非常量函数,你真的应该清理它们,或者至少提供 const 替代方案。

如果您要调用代码,则无法更改不使用 const 的代码,无论如何我都会使用 const,在最深的可用点使用 const_cast,然后对其进行注释。

正如 Shmoopty 指出的那样,该运算符的用处远没有它应有的有用,因为它不能用于 const 对象,即使其中只有一个是 const。不支持“a == 5”的数字等式运算符将在很大程度上违反最小惊讶法则。

于 2008-12-19T17:10:14.190 回答