나는 스마트 포인터를 이해하고 광산을 만들기 위해 놀고 있지만, 완전히 이해하지 못하는 상황을 경험하게된다. 여기 코드는 다음과 같습니다왜 할당 연산자 호출 생성자가 있습니까?
#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
클래스의 생성자가 호출된다. 나는 컴파일러가 오류를 줄 것이라고 생각했다. assingment 연산자는 아니지만 constructor을 호출하는 이유는 무엇입니까?
라고 A *의 오른쪽 걸리는 할당 연산자의 버전이 표시되지 않는 이유는 무엇입니까? – suszterpatt
@suszterpatt : 홀더 (T * tt) –