gpt4 book ai didi

c++ - 使用 std::function 作为 lambda 参数调用函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:32 25 4
gpt4 key购买 nike

我从这里得到的问题的基础: Failure to deduce template argument std::function from lambda function这个线程中的问题是:为什么这段代码不能将 lambda 传递给函数:

#include <iostream>
#include <functional>

template <typename T>
void call(std::function<void(T)> f, T v)
{
f(v);
}

int main(int argc, char const *argv[])
{
auto foo = [](int i) {
std::cout << i << std::endl;
};
call(foo, 1);
return 0;
}

这个线程中的答案是,因为 lambda 不是 std::function。但是为什么要编译这段代码:

#include <iostream>
#include <functional>

template <typename T>
void call(std::function<void(T)> f, T v)
{
f(v);
}

int main(int argc, char const *argv[])
{
auto foo = [](int i) {
std::cout << i << std::endl;
};
call({foo}, 1); // changed foo to {foo}
return 0;
}

最佳答案

如链接答案中所写,第一个版本无法编译,因为第一个参数的模板参数推导失败; lambda 永远不是 std::function<void(T)> .

第二个版本可以编译,因为,通过写 {foo} , std::function<void(T)>成为一个非推导的上下文。因此,对于第一个论点,推论不会再失败,因为它甚至都没有尝试过。所以T推导为 int仅来自第二个参数,并且调用成功,因为 lambda 可转换为 std::function<void(int)> .

来自 [temp.deduct.type]:

The non-deduced contexts are:

  • ...
  • A function parameter for which the associated argument is an initializer list but the parameter does not have a type for which deduction from an initializer list is specified.

关于c++ - 使用 std::function 作为 lambda 参数调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57705788/

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