lambda表达式的原因在于以“更方便的方式”隐式生成函数对象。正如下面的示例所示,它不仅不够方便且代码量更多,而且具有令人困惑的语法和符号。
在哪些情况下可以使用它,从而使得代码更易读?
cout << count(vec, [&](int a){ return a < x; }) << endl; // lambda
cout << count(vec, Less_than<int> (x)) << endl; // normal functor def-n
使用lambda函数更易于阅读,因为它将函数的实现直接放在调用点,从而保持了自然的从上到下的代码流。
你知道,普通函数有其优点和缺点。一方面,函数帮助减少代码中的重复,使代码更加结构化和易读。另一方面,函数打破了代码的自然流程并将控制传递到完全不同的位置。由于显而易见的原因,这可能会降低可读性:就像阅读充满嵌套前向和后向引用的书。
因此,为了正确地利用常规函数的特性,应该使用它们来实现经过深思熟虑、完整且隔离的抽象。这样,普通函数将提高代码的可读性。
但是对于小型的“一次性”一次性使用的实用程序代码,普通函数效果不佳。它们实际上会使代码显着变得不易读取。这就是lambda函数的发挥作用的地方。它们允许将一次性实用程序代码直接注入到需要的调用点。
auto fun = []() { return; };
被编译器替换为:
// Namespace scope
struct __lambda_1 {
void operator()() { return; }
};
// local scope
__lambda_1 fun{};
Less_than<int> (x)
怎么可能是“普通函数定义”???从你的第一个例子来看,似乎你需要将x
的值绑定到一个双参数比较器函数对象上,将其转换为单参数比较器。这已经超出了“普通函数定义”的功能范畴。 - AnT stands with Russia