C++ 是C++;这个保证的价值是多少?

C++ 是C++;这个保证的价值是多少?,c++,this,C++,This,假设我有一个类Foo(没有重载它的&operator),从这个类的&operator获得的地址是否保证与它的this指针具有相同的值 在下面的代码中,equalPointer是否保证返回true? 是否存在可能返回false的情况(例如,在考虑多重继承时) 有问题的代码吗?对 有没有这样的结构?也是 但是,是的,指向类X实例的指针总是等于类X中的“this”指针。它的基类或派生类不能这样说。是的,它是 f的指针是相同的,它被传递到f::equalPointer..内存布局问题。该标准并没有对内存

假设我有一个类Foo(没有重载它的&operator),从这个类的&operator获得的地址是否保证与它的
this
指针具有相同的值

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


有问题的代码吗?对

有没有这样的结构?也是

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

是的,它是


f
的指针是相同的,它被传递到
f::equalPointer
..

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

例如:

class Foo: public boost::noncopyable
{
public:
  virtual ~Foo();
};
因为
boost::noncopyable
没有
virtual
方法,所以在gcc
(void*)(Foo*)&f
(void*)(boost::noncopyable*)&f
中会有不同的值

但这在实践中并不重要,因为编译器将执行必要的调整。也就是说,如果你只比较
Foo*
你应该很好,很漂亮

。。。此外,如果层次结构中存在多个子对象,则多重继承可能会打破这一点

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

  • 要么没有层次结构(没有虚拟),然后可以按原样比较对象的地址
  • 或者有一个层次结构(和虚拟方法),您可以使用
    dynamic\u cast(&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);
}
模板
bool具有相同的动态位置(T常量和T,U常量和U)
{
返回动态强制转换(&t)=动态强制转换(&u);
}

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

Hmm。当函数被定义为
template bool equalPointer(T const*f)
并被称为
f.equalPointer(&f)
时会发生什么?
f==this
现在可以保证吗?那么偏移校正就不应该发生了,对吗?
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);
}