2012-05-11 23 views
8

std::allocatorconstructdestroy chức năng của thành viên này được tham số hoá vào loại nguyên tố này để xây dựng:Tại sao std :: allocator :: xây dựng và std :: allocator :: phá hủy templated trên loại phần tử?

template<class T> 
    class allocator 
{ 
    public: 
    typedef T value_type; 
    typedef T* pointer; 

    template<class U, class... Args> 
     void construct(U *p, Args&&... args); 

    template<class U> 
     void destroy(U *p); 

    ... 
}; 

lý do cho điều này là gì? Tại sao họ không chọn value_type* hoặc pointer? Có vẻ như allocator<T> chỉ nên biết cách xây dựng hoặc phá hủy các đối tượng thuộc loại T.

Trả lời

16

Đó là lý do tương tự mà allocator s được yêu cầu có loại rebind<U> typedef: vì nhiều vùng chứa không bao giờ phân bổ T s.

Lấy danh sách được liên kết. Các nút phân bổ này, mỗi nút trong số đó chứa một T là một thành viên. Vì vậy, allocator s được yêu cầu để có thể phân bổ một số loại mà họ không biết (thông qua rebind<U>). Tuy nhiên, yêu cầu hoạt động sao chép: yêu cầu tạo trình phân bổ mới của loại rebind<U>::other.

Tốt hơn nên tránh điều đó khi có thể. Vì vậy, để xây dựng và hủy diệt, các nhà phân bổ phải thực hiện các hoạt động thích hợp trên bất kỳ loại nào, chẳng hạn như các kiểu nút nội bộ của danh sách liên kết. Điều này cũng giúp loại nút nội bộ của danh sách liên kết có thể có Allocator::construct/destruct làm chức năng của bạn bè.