gpt4 book ai didi

c++ - 为什么我不能让 std::function::iterator> 绑定(bind)到返回该类型的 lambda?

转载 作者:太空宇宙 更新时间:2023-11-04 15:23:16 25 4
gpt4 key购买 nike

我不明白为什么这不起作用。我有一个返回 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 而不是普通的迭代器。

这是因为您的 lambda 按值捕获,使您的 std::vector const(以及它的迭代器)。通过引用捕获所有内容 works ,否则,您的 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);
}

关于c++ - 为什么我不能让 std::function<std::vector<T>::iterator> 绑定(bind)到返回该类型的 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com