Почему оператор присваивания вызывает конструктор?

Я просто играю, пытаясь понять умные указатели, и пытаюсь создать свои, но натолкнулся на ситуацию, которую не совсем понимаю. Вот код:

#include <iostream>
template <class T>
class Holder
{
private:
        T * obj;
public:
        Holder(T * tt) : obj(tt) 
        {
                std::cout << "ctor : " << tt->dummy << std::endl;
        }
        T * operator -> ()
        {
                return obj;
        }
        operator bool()
        {
                return obj;
        }
        T * const get() const
        {
                return obj;
        }
        void reset() {swap(0);}
        void swap(T * other)
        {
                obj = other;
        }
        Holder & operator = (const Holder& holder)
        {
                obj = holder.get();
                return *this;
        }
        Holder(const Holder & holder) : obj(holder.get()) {} 
};

class A
{
public:
        int dummy;
        A(int a) : dummy(a) {}
};

int main ()
{
        A * a = new A(1);
        Holder<A> holder(a);
        A * b = new A(2);
        holder = b;

        std::cout << holder->dummy << std::endl;

        return 0;
} 

Код компилируется, и в строке Holder = b; вызывается конструктор класса Holder . Я думал, компилятор выдаст ошибку. Это не оператор присваивания, но почему он вызывает конструктор?

11
задан ali_bahoo 8 December 2010 в 07:45
поделиться