2016-06-13 5 views
4

auto_ptr에 템플릿 복사 생성자와 대체 연산자 함수가있는 이유는 무엇입니까?왜 템플릿 복사 생성자가 있고 auto_ptr에서 연산자 함수를 재정의합니까?

C++의 ISO 표준은 auto_ptr에 대해 다음 인터페이스를 지정합니다. (이것은 2003 표준에서 바로 복사됩니다.)

namespace std { 
    template <class Y> struct auto_ptr_ref {}; 

    template<class X> class auto_ptr { 
    public: 
     typedef X element_type; 

     // 20.4.5.1 construct/copy/destroy: 
     explicit auto_ptr(X* p =0) throw(); 
     auto_ptr(auto_ptr&) throw(); 
     template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 
     auto_ptr& operator=(auto_ptr&) throw(); 
     template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 
     auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 
     ~auto_ptr() throw(); 

     // 20.4.5.2 members: 
     X& operator*() const throw(); 
     X* operator->() const throw(); 
     X* get() const throw(); 
     X* release() throw(); 
     void reset(X* p =0) throw(); 

     // 20.4.5.3 conversions: 
     auto_ptr(auto_ptr_ref<X>) throw(); 
     template<class Y> operator auto_ptr_ref<Y>() throw(); 
     template<class Y> operator auto_ptr<Y>() throw(); 
    }; 

이유가 있습니다 :

template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 

난 그냥 auto_ptr(auto_ptr&) throw();확인 생각합니다.

+0

분명히 이러한 방법은 (아마도) 다른 템플릿 유형으로 작동합니다. 귀하의 버전은 동일합니다. – deviantfan

답변

7

템플릿 복사 생성자를 사용하면 Derived으로 auto_ptrBase 클래스 유형으로 초기화 할 수 있습니다. 그것이 없으면 auto_ptr<Base>auto_ptr<Derived>은 완전히 관련없는 유형입니다.

struct Base {}; 
struct Derived : Base {}; 

auto_ptr<Derived> d(new Derived); 
auto_ptr<Base> b = d;