Здравствуйте, davenger, Вы писали:
D>Здравствуйте, WolfHound, Вы писали:
WH>>Сейчас читаю книжку Вандевурда и Джосатиса про шаблоны и там в операторах присваивания для проверки на присваивание к самому себе исползована такая конструкция
....
[skipped]
D>, и рядом с этим написан код типа:
D>D>template <typename T>
D> template <typename T2>
D>Stack<T>& Stack<T>::operator= (Stack<T2> const& op2)
D>{
D> if ((void*)this == (void*)&op2) { // assignment to itself?
D> return *this;
D> }
D> Stack<T2> tmp(op2); // create a copy of the assigned stack
D> elems.clear(); // remove existing elements
D> while (!tmp.empty()) { // copy all elements
D> elems.push_front(tmp.top());
D> tmp.pop();
D> }
D> return *this;
D>}
D>
D>не понятен смысл проверки (void*)this == (void*)&op2
Кажется, дело в том, что здесь this и op2 — разных типов T* и T2*.
Если сравнивать this == op2, то фактически выполниться this == (T*) op2.
А привести ситуацию, когда ((void*) op2 != (void*) (T*) op2) совсем несложно:
#include <stdio.h>
struct A { int a; };
struct B { int b; };
struct C : public A, public B
{
void test(B * p)
{
printf ("this %s p\n",
(this == p) ? "==" : "!=" );
printf("(void*)this %s (void*)p",
((void*)this == (void*)p) ? "==" : "!=");
};
};
void main()
{
C c;
c.test(&c);
};
ЗЫ: хотя сложно представить ситуацию когда такое сравнение пригодится