“lambda表达式”的优点是什么?

时间:2013-08-11 02:00:38

标签: c++ syntax lambda

lambda表达式的原因是以“更方便的方式”隐式生成函数对象。从下面的示例中可以看出,它不仅不太方便而且更长,而且还具有令人困惑的语法和符号。

是否有任何用途,它实际上使代码更具可读性?

cout << count(vec, [&](int a){ return a < x; }) << endl;  // lambda
cout << count(vec, Less_than<int> (x)) << endl;           // normal functor def-n

2 个答案:

答案 0 :(得分:13)

它更具可读性,因为它将函数的实现放在调用它的位置,从而保持代码的自然顶部到底部流不变。

你看,普通的功能各有利弊。一方面,函数有助于减少代码中的重复,这使代码更具结构化和可读性。另一方面,函数打破了代码的自然流动并将控制转移到完全不同的位置。这可能会因为相当明显的原因而降低可读性:就像读一本充满嵌套前向和后向引用的书一样。

因此,为了正确利用普通函数的属性,应该使用它们来实现经过深思熟虑,完整和孤立的抽象。通过这种方式,普通函数将提高代码的可读性。

但对于小型“一次性”一次性使用实用程序代码,普通功能不能很好地工作。它们实际上可以使代码的可读性大大降低。这就是lambda函数的用武之地。它们允许用户将一次性实用程序代码直接注入调用点,在必要的地方。

答案 1 :(得分:1)

lambda表达式的存在是为了简化代码。这样:

auto fun = []() { return; };

由编译器替换为:

// Namespace scope
struct __lambda_1 {
    void operator()() { return; }
};

// local scope
__lambda_1 fun{};

这是lambda语法的主要动机:用在需要它的站点声明的更容易读取的匿名函数替换传统函数对象,而不是必须在另一个作用域中声明一个单独的函数对象。它不仅仅是替换命名的函数对象。

实际上,标准库包括许多命名的函数对象,如std::unary_function和类似std::less的东西。但是这些对象的效用有限,不能承担lambda所能发挥的每一个潜在作用。

所以,是的,通过放置标准库无法准确提供所需代码的代码,可以使代码更具可读性,而不会用十几行struct污染您的代码并污染您的命名空间您可能使用的名称不超过一次或两次。