Lambda表达式采用向量

时间:2017-11-20 17:22:02

标签: c++ visual-c++ lambda unique-ptr erase-remove-idiom

我的资源类型为foos的唯一指针的向量Foo。我想删除其中一些满足给定条件的内容。我该怎么做?

class Foo
{
public:
    int some_num;
    Foo(int some_num_) :some_num{ some_num_ }
    {}
    int getNum()
    {
        return some_num;
    }
};

using FooPtr = std::unique_ptr<Foo>;
using Foos = std::vector<FooPtr>;

int main()
{
    Foos foos;
    foos.push_back(std::move(std::make_unique<Foo>(30)));
    foos.push_back(std::move(std::make_unique<Foo>(35)));
    std::vector<int> some_nums = { 35, 30, 25 };
    for each (auto& num in some_nums)
    {
        foos.erase(std::remove_if(foos.begin(), foos.end(), 
             [&](auto foo) {return num == foo->getNum(); }), foos.end());
    }
    return 0;
}

看起来我正在复制unique_ptr,因此我收到以下错误,

'std::unique_ptr<Foo,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function

我该怎么做?我不会使用该资源。除此之外,我并不关心所有权。

1 个答案:

答案 0 :(得分:3)

auto扣除规则会将类型推断为std::unique_ptr,从而强制复制。因此,只需将lambda表达式的参数类型更改为

即可
[&](const auto& foo) {return num == foo->getNum(); })