这个C++值有保证吗?

Cis*_*one 8 c++ this

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

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

class Foo
{
  bool equalPointer(const Foo * f} { return f==this; }
}
Foo f;
f.equalPointer(&f);
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 3

问题是内存布局之一。该标准对内存布局没有太多保证,特别是它不保证派生类和基类之间不存在偏移......

例如:

class Foo: public boost::noncopyable
{
public:
  virtual ~Foo();
};
Run Code Online (Sandbox Code Playgroud)

因为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);
}
Run Code Online (Sandbox Code Playgroud)

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