比较指针和引用

5

我正在重构一段遗留代码。我需要将指针与引用进行比较,以确定两个对象是否相等。SO中的此问题通过比较内存地址来判断它们是否相等。如果我像下面这样将指针和引用进行比较,会出现任何问题(任何特殊情况)吗?到目前为止,在我的测试中,它正常工作。请给些建议。

#include <stdio.h>
#include <iostream>

class MemberData
{
    //Huge class with many data members
};

int main()
{
    MemberData  x ;
    const MemberData& y = x;
    MemberData *ptr= &x;


    if(std::addressof(*ptr)==std::addressof(y))
    {
            std::cout << "Both are equal" << "\n";  
    }

    return 0;
}

1
当你说“检查两个对象是否相等”时,你是指检查它们是否“相等”,还是检查它们是否“完全相同的对象”。 - Tas
@Tas 检查完全相同的对象。请检查我的评论以获取错误信息。 - RobinAtTech
2个回答

3

std::addressof(*ptr) 看起来多余。如果你有一个指向对象的指针,并且你需要一个指向该对象的指针,那么为什么要通过指针间接访问对象并获取该指针呢?ptr == std::addressof(y)也同样适用。只要你想比较地址的相等性...

(检查两个对象是否相等)

比较地址的相等性是比较身份,即它们是否是同一个对象。要比较对象的相等性,通常会比较它们的值。例如,以下变量不是同一个对象,因此没有相同的地址,但它们在值上是相等的(假设存在合理的拷贝构造函数):

MemberData x;
MemberData y = x;

更好的是我解释一下整个情况。一个向量容器有成员列表,我要比较的成员是一个常量&memberdata,在函数内部,它来自于向量容器。由于它是const&引用,所以在整个过程中不需要比较它们的值,因为这很耗费时间,而且数据量很大。因此,仅进行身份比较就足够了。 - RobinAtTech

0
你提供的代码将始终打印“Both are equal”,因为你所做的是检查x的地址和x的别名的地址,这当然是相同的。真正的问题是,你只想检查地址的相等性而不是它们内部成员的相等性,即两个具有不同地址但具有相同值的同一类对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接