空结构背后的目的?

时间:2010-07-23 08:27:32

标签: c++ pointers

来自C ++标准库的auto_ptr声明

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

}

我不明白这部分的目的:

template <class Y> struct auto_ptr_ref {};

如果不声明任何变量,这些变量如何有效:

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

以及这些:

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

编辑:以及(我只是注意到)我不明白最后两行如何使用“运算符”。语法不是“return-type operatoroperand;”,返回类型在哪里?操作数?

2 个答案:

答案 0 :(得分:4)

Google搜索“auto_ptr_ref”会显示this detailed explanation

我不太明白这个解释,但看起来就是以下情况。如果没有这个技巧,你可以将auto_ptr传递给一个函数,该函数将获得对象的所有权并将您的变量赋值给空指针。使用上面的额外类技巧,在这种情况下会出现编译错误。

答案 1 :(得分:3)

您已复制auto_ptr上维基百科条目中的文字,不是吗?这只是{strong>公共接口到auto_ptr和co。,而不是实现的摘录。他们在文章中将auto_ptr_ref身体留空,表明内部存在图书馆用户的注意事项。

这里最后两行:

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

是转化运算符。转换运算符的语法略有不同,因为声明转换运算符的返回类型(它已经是名称!)是没有意义的,所以你不要写int operator int();而只是operator int(); < / p>

如果您需要讨论如何在auto_ref中使用auto_ptr_ref,那么SO有几个。例如这里: what is auto_ptr_ref, what it achieves and how it achieves it