2015-12-15 17 views
7

Tôi đã lớp mẫu sau (rút gọn để chỉ chứa các bộ phận liên quan) với một phương pháp gọi là Push viết bằng C++ 11:std :: di chuyển hoặc std :: về phía trước với tham số std :: unique_ptr <T> &&

template<class T, int Capacity> 
class CircularStack 
{ 
private: 
    std::array<std::unique_ptr<T>, Capacity> _stack; 

public: 
    void Push(std::unique_ptr<T>&& value) 
    { 
     //some code omitted that updates an _index member variable 

     _stack[_index] = std::move(value); 
    } 
} 

câu hỏi của tôi là:

tôi có nên được sử dụng std::move hoặc std::forward trong Push?

Tôi không chắc chắn liệu std::unique_ptr<T>&& đủ điều kiện để tham khảo phổ quát và do đó nên sử dụng forward hơn move.

Tôi mới hợp lý với C++.

+0

Nếu bạn đang đến từ một ngôn ngữ mang tính, hãy thử không bắt chước cách tiếp cận "tham chiếu đến". Trong C++, mảng đối tượng nên trong hầu hết các trường hợp một mảng đối tượng, không phải là một mảng các tham chiếu được điền động với 'mới'. ghi nhớ nó trong tâm trí. –

+0

Bản sao: http://stackoverflow.com/q/9671749, http://stackoverflow.com/q/7257144. –

+0

Cảm ơn bạn đã tip, sẽ 'std :: unique_ptr ' được OK cho 'Push' sẽ được đưa ra trường hợp của các loại thừa kế' T'? – keith

Trả lời

9

Bạn nên sử dụng std::move.

std::unique_ptr<T>&& là tham chiếu rvalue, không phải là tham chiếu chuyển tiếp *. Tham chiếu chuyển tiếp trong tham số hàm phải giống như T&& trong đó T được suy luận, tức là tham số mẫu của hàm đang được khai báo.

* tham chiếu chuyển tiếp là tên ưa thích cho những gì bạn gọi là tham chiếu toàn cầu.

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