C 11 Lambda 函数的类型推导限制
C 11 允许模板类型推导,但在 lambda 函数或 std 时存在限制: : 涉及到函数。当使用带有模板参数的函数时,编译器通常可以从参数类型推断出模板类型。但是,当直接在参数中使用 lambda 时,此推导会失败。
问题陈述
以下代码无法推导函数 filter() 的模板类型:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // ... }
当使用 lambda 函数作为比较参数直接调用此函数时,编译器会引发错误:
filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
错误原因
此错误的根本原因在于 lambda 函数的本质。虽然它们的行为类似于函数对象,但它们并不是真正的函数。 Lambda 函数不会隐式转换为 std::function 对象,这将允许编译器推断类型。
解决方法
存在多种解决方法来解决推导问题:
1。显式模板参数:
显式指定模板参数:
filter<int>(mySet, [](int i) { return i % 2 == 0; });
2.创建一个 std::function 对象:
将 lambda 函数转换为 std::function 对象并将其作为参数传递:
std::function<bool(int)> compare = [](int i) { return i % 2 == 0; }; filter(mySet, compare);
3.使用替代函数定义:
重新定义 filter() 函数以接受通用比较函数对象:
template<class Value, class CompareType> set<Value> filter(const set<Value>& input, CompareType compare) { // ... }
现在,可以直接使用 lambda 函数调用该函数:
filter(mySet, [](int i) { return i % 2 == 0; });
结论
Lambda函数提供了一种定义短期函数的便捷方法,但它们可能会引入模板类型推导的复杂性。通过了解限制并使用适当的解决方法,开发人员可以有效地利用 C 11 代码中的 lambda。
以上是为什么'filter()”中的 Lambda 函数的 C 11 模板类型推导失败?的详细内容。更多信息请关注PHP中文网其他相关文章!