为什么我不能让 std::function<std::vector<T>::iterator> 绑定到返回该类型的 lambda?



我不明白为什么这不起作用。我有一个返回std::find方法结果的函数。我读到它返回一个迭代器到它找到的对象。但是当我尝试传递返回那个值的lambda时它给了我一堆错误,为什么?

void f(std::function<std::vector<int>::iterator()>) {}
int main()
{
    std::vector<int> v{0, 1, 2, 3};
    auto p = [=] (int n) {
        return std::find(v.begin(), v.end(), n);
    };
    f(p);
}

我得到很多难以理解的错误。我甚至在这里做了一个类型检查,它返回了true:

std::is_same<std::vector<int>::iterator, decltype(std::find(v.begin(), v.end(), N))>::value;
// -> true

那么,当我传递一个函数给fstd::function返回这种类型时,为什么不工作呢?

假设std::function参数中缺少int参数是复制粘贴错误,显然v.begin()v.end()返回const_iterator s而不是正常的迭代器。

这是由于您的lambda是按值捕获的事实,使您的std::vector const(因此它的迭代器)。通过引用捕获所有内容有效,否则,您的std::function应该返回const_iterator:

#include <vector>
#include <functional>
#include <algorithm>
void f(std::function<std::vector<int>::iterator (int)>) {}
int main()
{
    std::vector<int> v{0, 1, 2, 3};
    auto p = [&] (int n) {
        return std::find(v.begin(), v.end(), n);
    };
    f(p);
}

当您按值捕获时,捕获的vector(以及关联的迭代器)默认为const。如果您希望它是可变的,则需要更改lambda:

auto p = [=] (int n) mutable {
    return std::find(v.begin(), v.end(), n);
};

因为f期望一个不带参数的函数,但是lambda有一个int形参

相关内容

最新更新