比较地址足够这个`operator ==`?

时间:2012-01-26 22:26:29

标签: c++ operators

我正在为我的活动系统创建一个自定义RTTI系统。以下是EventTypeInfo课程。如您所见,它是不可复制的,就像std::type_info一样。

class EventTypeInfo
{
  public:
    EventTypeInfo(const EventTypeInfo&) = delete;
    EventTypeInfo& operator=(const EventTypeInfo&) = delete;

    inline bool operator==(const EventTypeInfo& other) const {
        return this == &other;
    }
};

我为每个事件类创建这些对象的方法归结为:

template<class EventClass>
const EventTypeInfo& event::type::info()
{
    static EventTypeInfo typeinfo;
    return typeinfo;
}

鉴于(1)这些对象是静态创建的(这意味着它们将持续整个应用程序的持续时间),(2)它们是不可复制的,(3)无法修改EventTypeInfo没有诉诸const_cast的字段,是否足以让我实施operator==this == &other的条款,还是我错过了什么?

4 个答案:

答案 0 :(得分:4)

如果您确定每种类型只有一个实例,那么地址比较就可以了。

对于std :: type_info是不够的,因为标准不保证其唯一性。

答案 1 :(得分:2)

对于多模块应用程序,我认为每个模块最终都可能拥有自己的静态类型信息对象副本。因此,如果您的事件可以在模块之间飞行,那么仅仅比较一个地址可能是不够的。

据我所知,RTTI system in GCC had this sort of problem in past,它造成了麻烦。最后,在GCC 4.5中GCC developers admitted it and fixed to use string comparison

所以我建议你先做指针比较,如果失败了,那就检查一下更可靠的机制。

答案 2 :(得分:1)

等于(深或浅)

的语义

在一般情况下,我认为这还不够。

考虑你有两个不同的实例(地址),但是内容/内部相同的情况。

  • 你想让它返回true(人们通常会想到的,让我们说两个字符串都是值“foo”但是在不同的时间实例化)?
  • 或者是假(你的捷径会回来)?

如果它真的是后者,那么也许你的捷径可行:你的捷径确实是一种浅层比较

  

例如,如果你可以保证每个事件都有一个   不管怎样,不同的时间戳会导致两个不同的实例   无论如何都要返回false(并且你关心时间戳进行比较   目的),使用捷径会很好。

否则,按正常方式进行(深度比较或至少一级浅比较)。

归根结底,在这种情况下,它取决于你对等于什么的解释/语义。

如果您执行选择比较地址,我建议您对您的实施进行评论,以便您的代码的未来读者能够理解您已经考虑过您的实施,这是真的你的意图。

答案 3 :(得分:0)

你还没有向我们展示足够的课程。没有任何数据成员,没有地址来确定它们是否相等。如果您的示例中没有包含数据成员,是否可以创建包含相同数据的两个实例?这些实例应该相等吗?