我不明白为什么这不起作用。我有一个返回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
那么,当我传递一个函数给f
与std::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形参