2010-07-23 35 views
5

khai báo của auto_ptr từ Thư viện chuẩn C++Mục đích đằng sau cấu trúc rỗng?

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

}

Tôi không hiểu mục đích của phần này:

template <class Y> struct auto_ptr_ref {}; 

Nếu không tuyên bố bất kỳ biến, làm thế nào có thể những có giá trị:

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

và các mục này:

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

Edit: và cũng (Tôi chỉ cần thông báo) Tôi không hiểu làm thế nào "điều hành" được sử dụng cho hai dòng cuối cùng. Không phải cú pháp giống như "toán tử trả về kiểu trả về", ở đâu là kiểu trả về? toán hạng?

+0

ah tôi chỉ đơn giản là không bao giờ biết về điều đó mặc dù (vẫn còn mới đến đây) – user385261

+1

@ user385261: Khi bạn mới vào trang web, hãy đọc Câu hỏi thường gặp của họ. Nó không có cho đá. –

Trả lời

4

Tìm kiếm của Google cho "auto_ptr_ref" tiết lộ this detailed explanation.

Tôi không nhận được lời giải thích đó, nhưng có vẻ như nó là như sau. Nếu không có thủ thuật đó, bạn có thể vượt qua một số auto_ptr thành một hàm có quyền sở hữu đối tượng và gán biến của bạn cho một con trỏ rỗng. Với lừa thêm lớp ở trên, bạn sẽ nhận được một lỗi biên dịch trong trường hợp này.

3

Bạn đã sao chép văn bản từ mục nhập wikipedia trên auto_ptr, phải không? Đây chỉ là giao diện công khai đến auto_ptr và các công cụ khác, chứ không phải trích đoạn từ quá trình triển khai. Họ để trống nội dung auto_ptr_ref trong bài viết để chỉ ra rằng có ghi chú bên trong cho người dùng thư viện.

Hai dòng cuối cùng ở đây:

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

là nhà khai thác chuyển đổi. Cú pháp của các toán tử chuyển đổi khác nhau một chút, bởi vì nó không có ý nghĩa để khai báo kiểu trả về của toán tử hội tụ (đó là tên đã!), Vì vậy bạn không viết int operator int(); nhưng chỉ operator int();

Nếu bạn cần thảo luận làm thế nào auto_ptr_ref được sử dụng trong auto_ref, SO có một vài trong số họ. Ví dụ ở đây: what is auto_ptr_ref, what it achieves and how it achieves it

Các vấn đề liên quan