这个C ++值有保证吗?

时间:2010-12-02 21:44:17

标签: c++ this

考虑我有一个类Foo(没有&运算符重载)是从&获得的地址。该类的运算符保证与其this指针具有相同的值?

在下面的代码中,equalPointer保证返回true? 是否有任何可能返回错误的情况(例如在考虑多重继承时)?

class Foo
{
  bool equalPointer(const Foo * f} { return f==this; }
}
Foo f;
f.equalPointer(&f);

3 个答案:

答案 0 :(得分:3)

问题是内存布局问题。该标准并不能保证内存布局,特别是它不能保证派生类和基类之间不存在偏移...

例如:

class Foo: public boost::noncopyable
{
public:
  virtual ~Foo();
};

由于boost::noncopyable没有virtual方法,因此在gcc (void*)(Foo*)&f(void*)(boost::noncopyable*)&f中会有不同的值。

但这在实践中并不重要,因为编译器将执行必要的调整。也就是说,如果你只比较Foo*,那你就应该没问题了......

...如果您的层次结构中有多个Foo子对象,多重继承可能会破坏这一点。

另一方面,你应该处于以下两种情况之一:

  • 要么没有层次结构(没有虚拟),那么您可以按原样比较对象的地址
  • 或者有一个层次结构(和虚方法),并使用dynamic_cast<void*>(&f)来获取整个对象的地址。

因此,作为模板方法,这将给出:

template <typename T, typename U>
bool have_same_dynamic_location(T const& t, U const& u)
{
  return dynamic_cast<void*>(&t) == dynamic_cast<void*>(&u);
}

(仅当T和U都有虚拟方法时才有效)

答案 1 :(得分:2)

有问题的代码?是。

是否存在不太正确的结构?也是的。

但是,是的,指向类X实例的指针总是等于类X中的'this'指针。同样不能说它的基类或派生类。

答案 2 :(得分:2)

是的,是的。

f的指针是相同的,它会传递给f::equalPointer ......