[英]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::function
将std::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.