【问题标题】:What are the default comparison operators for objects?对象的默认比较运算符是什么?
【发布时间】:2012-11-15 22:12:37
【问题描述】:

我在我的代码中发现了一个错误,我在对结构容器进行排序时忘记使用自定义比较器。这让我想知道它使用什么作为小于运算符,因为我没有为结构定义任何内容。

当没有定义这些运算符时,对象如何比较 和 ==?是通过内存地址吗?是否在标准中定义?我在 Google 上找不到任何此类信息。

编辑:

这是我使用的类:

using namespace std;

typedef unsigned id;

class LogEntry {
    id master_id;
    string timestamp;
    string category;
    string message;
    string str_rep;

public:
    LogEntry(id id, string t, string c, string m) :
            master_id(id), timestamp(t), category(c), message(m) {
    }

    string get_timestamp() const {
        return timestamp;
    }

    string get_category() const {
        return category;
    }

    string get_message() const {
        return message;
    }

    string to_string() {
        ostringstream ss;
        ss << master_id << "|" << timestamp << "|" << category << "|"
                << message;
        return ss.str();
    }

    id get_id() const {
        return master_id;
    }
};

编辑2:

我意识到我犯了一个愚蠢的错误。我正在存储一个指向对象的指针向量。因此,指针很可能通过地址进行比较。如果我没有存储指针,我认为它不会编译。

编辑3: KerrekSB 在他的答案的 cmets 中发布了一个相关的有趣链接:How can pointers be totally ordered?

【问题讨论】:

  • 听起来很奇怪。我本来希望您的代码无法编译。也许向我们展示一个重现此的 testcase
  • @LightnessRacesinOrbit 哦,我没有提供测试用例,因为我认为有一些默认值......如果不是这样,我会尽快发布一些代码。

标签: c++ comparison comparison-operators


【解决方案1】:

默认比较器是标准模板std::less&lt;T&gt;,它只对xy 类型为T 的两个对象使用x &lt; y。这可以通过多种方式发挥作用:

  • T 是一种算术基本类型,使用了内置运算符。

  • T 是一个类类型,并且有一个成员 operator&lt;

  • 有一个免费功能operator&lt;(T const &amp;, T const &amp;)

  • 您的用户定义类型具有到内置类型的隐式转换函数,该函数为调用内置 &lt; 提供了唯一路径。

此外,可以将std::less 专门用于您的用户定义类型T

【讨论】:

  • 但是如果该类没有定义任何operator&lt;,它将如何评估x &lt; y
  • @gsingh2011:以我列出的其他方式之一。
  • 但是我写的类不是基本类型,我还没有定义任何看起来像operator&lt;(T const &amp;, T const &amp;)的函数。本质上它看起来像class Foo { int a; string b; }
  • @gsingh2011:只有当它被称为operator&lt;。也许如果您的类型具有隐式转换功能? [编辑:]是的,就是这样。我加了。
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2012-10-19
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多