Цель за пустой структурой? - PullRequest
5 голосов
/ 23 июля 2010

Объявления auto_ptr из стандартной библиотеки C ++

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

Редактировать: а также (я просто замечаю) я не понимаю, как "оператор" используется для последних двух строк. Разве синтаксис не является чем-то вроде «оператора возвращаемого типа», где тип возвращаемого значения? операнд?

Ответы [ 2 ]

4 голосов
/ 23 июля 2010

Поиск Google для "auto_ptr_ref" показывает это подробное объяснение .

Я не совсем понимаю это объяснение, но похоже, что оно для следующего. Без этого трюка вы могли бы передать auto_ptr в функцию, которая получит владение объектом и присвоит вашу переменную нулевому указателю. С помощью дополнительного трюка класса выше вы получите ошибку компиляции в этом случае.

3 голосов
/ 23 июля 2010

Вы скопировали текст из записи в википедии на auto_ptr, не так ли? Это только открытый интерфейс до auto_ptr и др., А не отрывок из реализации. Они оставили тело 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();

Если вам нужно обсудить, как auto_ptr_ref используется в auto_ref, у SO есть пара из них. Например здесь: что такое auto_ptr_ref, чего он добивается и как он этого добивается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...