繁体   English   中英

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

[英]Why can't I get std::function<std::vector<T>::iterator> to bind to lambda returning that type?

我不明白为什么这行不通。 我有一个函数,返回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

那么,当我使用返回此类型的std::functionstd::function传递给f时,为什么这不起作用?

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

这是由于您的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参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM