Được cung cấp std::vector<std::unique_ptr<SomeType> >
, việc sử dụng remove_if
có hợp pháp không? Nói cách khác, với mã này:Bạn có thể sử dụng `std :: remove_if` trên vùng chứa` std :: unique_ptr` không?
std::vector<std::unique_ptr<SomeType> > v;
// fill v, all entries point to a valid instance of SomeType...
v.erase(std::remove_if(v.begin(), v.end(), someCondition), v.end());
, tôi đảm bảo sau khi erase rằng tất cả các con trỏ vẫn ở v
là hợp lệ. Tôi biết rằng việc triển khai trực quan std::remove_if
và được cung cấp tất cả các triển khai mà tôi đã xem, chúng sẽ là. Tôi muốn biết nếu có bất cứ điều gì trong tiêu chuẩn mà đảm bảo nó; tức là std::remove_if
không được phép sao chép bất kỳ mục nhập hợp lệ nào mà không sao chép bản sao vào vị trí cuối cùng .
(Tôi, tất nhiên, giả rằng tình trạng này không sao chép Nếu điều kiện có một chữ ký như:.
struct Condition
{
bool operator()(std::unique_ptr<SomeType> ptr) const;
};
, thì tất nhiên, tất cả các con trỏ sẽ không hợp lệ sau remove_if
.)
James Kanze đặt câu hỏi - một hiện tượng rất hiếm! – Nawaz
'unique_ptr' không phải là bản sao có thể xây dựng được, vì vậy nếu bạn đã sử dụng vị ngữ đó, mã của bạn sẽ không biên dịch. – interjay
Tại sao không? 'std :: unique' không thể sao chép được nhưng có thể di chuyển được. Nó có thể được chuyển đến cuối container. –