2010-07-23 7 views
5

Déclarations de auto_ptr de C++ Standard LibraryLe but de struct vide?

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>) 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(); 
}; 

}

Je ne comprends pas le but de cette partie:

template <class Y> struct auto_ptr_ref {}; 

Sans déclarer une variable, comment peut-être valide:

auto_ptr&      operator=(auto_ptr_ref<X>) throw(); 

et ceux-ci aussi:

auto_ptr(auto_ptr_ref<X>) throw(); 
    template <class Y> operator auto_ptr_ref<Y>() throw(); 

Edit: et aussi (je remarque juste) Je ne comprends pas comment le « opérateur » sont utilisés pour les deux dernières lignes. La syntaxe n'est-elle pas quelque chose comme "return-type operatoroperand;", où est le type de retour? opérande?

+0

ah je ne sais tout simplement jamais cela (encore nouveau ici) – user385261

+1

@ user385261: Lorsque vous êtes nouveau sur un site Web, lisez leur FAQ. Ce n'est pas là pour des coups de pied. –

Répondre

4

La recherche Google pour "auto_ptr_ref" révèle this detailed explanation.

Je ne comprends pas très bien cette explication, mais on dirait que c'est la suivante. Sans cette astuce, vous pourriez passer un auto_ptr dans une fonction qui obtiendrait la propriété de l'objet et attribuer votre variable à un pointeur nul. Avec le tour de classe supplémentaire ci-dessus, vous obtiendrez une erreur de compilation dans ce cas.

3

Vous avez copié le texte de l'entrée wikipedia sur auto_ptr, n'est-ce pas? Ce n'est que l'interface publique à auto_ptr et co., Pas un extrait d'une implémentation. Ils ont laissé le corps auto_ptr_ref vide dans l'article pour indiquer qu'il y a une indication à l'intérieur pour un utilisateur d'une bibliothèque.

Les deux dernières lignes ici:

template <class Y> operator auto_ptr_ref<Y>() throw(); 
template <class Y> operator auto_ptr<Y>() throw(); 

sont des opérateurs de conversion. La syntaxe des opérateurs de conversion diffère un peu, car il n'a pas de sens de déclarer le type de retour d'un opérateur converion (c'est le nom déjà!), De sorte que vous ne pas écrire int operator int(); mais juste operator int();

Si vous avez besoin d'une discussion comment auto_ptr_ref est utilisé dans auto_ref, SO en a deux. Par exemple ici: what is auto_ptr_ref, what it achieves and how it achieves it