C ++ 14通用lambda是否对语言进行了真正的改进,还是它们是一种语法糖?是否有某些情况
[](auto param1, auto param2, /* ... */ auto paramN)
{
return /* ... */;
}
不能被替换
template <typename Type1, typename Type2, /* ... */ typename TypeN>
auto foo(Type1&& param1, Type2&& param2, /* ... */ TypeN&& paramN)
{
return /* ... */;
}
或者
struct bar
{
template <typename Type1, typename Type2, /* ... */ typename TypeN>
auto operator()(Type1&& param1, Type2&& param2, /* ... */ TypeN&& paramN)
{
return /* ... */;
}
};
?
@Kerrek SB在注释中提供了非常有趣的链接,这些链接说明了通用lambda的功能:
Boost.Hana:用于表达性元编程的异构组合器(github)
对于C ++ 11的非泛型lambda表达式,可以执行一些直接的转换:
void foo()
{
int i = 42; int j = 22;
auto f = [i, &j](int k) { return i + j + k };
// proceed to use f
}
例如:
void foo()
{
int i = 42; int j = 22;
struct {
int i; int& j;
// can't deduce return type
int operator()(int k) const
{ return i + j + k; }
} f { i, j };
// proceed to use f
}
对于C ++ 14的通用lambda表达式,并不是那么简单。假设这次我们使用auto f = [i, &j](auto k) { return i + j + k; }
。然后,我们必须产生以下调用运算符:
template<typename T>
auto operator()(T k) const { return i + j + k; }
问题在于我们无法在功能范围内定义模板(一种限制,也称为无本地模板)。因此,我们必须将封闭类型定义从封闭函数中移出至名称空间范围(在过程中为其命名),然后使用closure_type f { i, j };
。顺便说一句,这意味着我们必须给类及其操作符某种形式的链接,而函数局部定义没有链接。
因此,从某种意义上说,通用lambda表达式为我们提供了局部功能模板的有限版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句