请考虑以下代码段:
bool SomeObject::equal(const SomeObject& rhs) const
{
if (this == &rhs)
{
return true;
}
// check the state
}
此代码的问题是SomeObject
可能会覆盖operator&
(或者有人可能会在将来添加它),这反过来可能会破坏此实现。
是否可以测试rhs
和*this
是否是同一个对象而不受operator&
实施的支配?
答案 0 :(得分:18)
如果您想获取对象的实际地址并忽略重载的&
运算符,请使用std::addressof
bool SomeObject::equal(const SomeObject& rhs) const
{
if (this == std::addressof(rhs))
{
return true;
}
// check the state
}
答案 1 :(得分:3)
C ++ 11中有一个std::addressof
函数可以做你想要的。
如果您想自己实现它,可以使用转换为其他类型:
(SomeClass*)&reinterpret_cast<char&>(rhs)
然而,我不会打扰; const equals
函数应该适用于相同的参数。
答案 2 :(得分:0)
如果您完全删除了这个条件怎么办?有人会多久将一个物体与自身进行比较?如果您通常需要检查所有数据成员,那么这个简单的比较只会浪费一般情况下的时间。只要两个物体在物理上是相同的(并且你的功能是const
,所以你应该没问题),那么在极少数情况下做一些额外的工作有什么害处?
答案 3 :(得分:-2)
只需将指针传递给SomeObject而不是引用,因此您不需要&amp;运营商了。
它希望如此:
bool SomeObject::equal(const SomeObject* rhs) const
{
if ( this == rhs )
{
return true;
}
//...
}