gpt4 book ai didi

c++ - Lamba 类型不是由模板函数或 auto 关键字推导出来的

转载 作者:行者123 更新时间:2023-11-30 01:08:42 26 4
gpt4 key购买 nike

我很难理解这一点。我知道我的编译器 (Visual Studio) 知道 lambda 是什么“类型”,因为有时它显示它是一个 lambda,但是我的模板没有推导出它,auto 关键字也没有。

template <typename T> void templatedFunc(T (*funcPtr)(void)) { }

int main()
{
templatedFunc([] () { return 6;} ); // Error, no template matches argument list

int (*funcPtr)(void) = [] () { return 6;};
templatedFunc(funcPtr); // Works fine

auto p = [] () { return 6; };
templatedFunc(p); // Error, no template matches

auto p = [] () -> int { return 6; }; // Trying with explicit return type
templatedFunc(p) // Error, still doesn't work
}

我真的不明白,任何帮助都会很棒。当我将鼠标悬停在变量“p”上时,它显示其类型为 int()。我可以使这项工作的唯一方法是显式声明一个指针,如:

int (*ptr) (void) = [] () { return 6;};

我不断收到的错误是:

No instance of function template matches the argument list. Argument types are lambda []int () -> int

谢谢。

最佳答案

(适当类型的)闭包对象具有到函数指针类型的隐式转换,但它本身并不是函数指针。模板参数推导不考虑隐式转换;你拥有的不是与你的函数模板签名相匹配的模式。

第一个代码示例之所以有效,是因为提前执行了到函数指针的转换。

编写接受可调用对象的函数模板的更好方法是根本不使用函数指针,而是对可调用对象本身进行参数化:

template <typename T> void templatedFunc(T f) { f(); }

关于c++ - Lamba 类型不是由模板函数或 auto 关键字推导出来的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41651710/

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