考慮我有一個Foo類(沒有它的&運算符重載)是從這個類的&運算符獲得的地址保證與它的this
指針具有相同的值嗎?這是保證的C++值嗎?
在下面的代碼是equalPointer保證返回true? 有沒有可能返回錯誤的情況(例如,在考慮多重繼承時)?
class Foo
{
bool equalPointer(const Foo * f} { return f==this; }
}
Foo f;
f.equalPointer(&f);
考慮我有一個Foo類(沒有它的&運算符重載)是從這個類的&運算符獲得的地址保證與它的this
指針具有相同的值嗎?這是保證的C++值嗎?
在下面的代碼是equalPointer保證返回true? 有沒有可能返回錯誤的情況(例如,在考慮多重繼承時)?
class Foo
{
bool equalPointer(const Foo * f} { return f==this; }
}
Foo f;
f.equalPointer(&f);
的問題是內存佈局之一。該標準不保證不多的內存佈局,尤其是它並不能保證沒有偏移派生和基類之間存在......
例如:
class Foo: public boost::noncopyable
{
public:
virtual ~Foo();
};
因爲boost::noncopyable
沒有按」 t有一個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均具有虛擬方法)
隨着代碼的問題?是。
是否存在這樣的結構?也是。
但是,指向類X實例的指針總是等於類X中的'this'指針。對於其基類或派生類,不能這麼說。
嗯。當函數被定義爲`template
是的。
的f
指針是一樣的,它被傳遞給f::equalPointer
...
+1是的!!!另請參閱此問題http://stackoverflow.com/q/1742848/57428 – sharptooth 2010-12-03 08:04:13