除了方便之外,还有lambda的其他优点吗?

时间:2014-09-17 16:08:55

标签: c++ c++11 lambda

标题可能不准确,但我想不出任何简短的标题。 (随意建议或编辑我的问题。)

我想知道使用lambda函数是否有任何其他优点,除了事实上不需要显式定义(和写入)函数的整个类定义或定义要使用的单独函数(可能)只有一次。换句话说,lambda是为了方便而引入的还是更多呢?

编辑: 有一点要补充我的问题。 Lambdas允许程序员写得更少,更方便,并且因此他们不易出错。这本身就是一种与方便不同的东西/理由,但却与它有关。

5 个答案:

答案 0 :(得分:8)

A proposal to add lambda functions to the C++ standard 看到lamdas的完整动机:

  如果C ++支持lambda,那么使用C ++标准库算法将会更加愉快。 Lambda函数可以让人们在许多情况下使用C ++标准库算法,目前在编写for循环时更容易。许多开发人员仅仅因为语法开销而不使用函数对象。

答案 1 :(得分:5)

Lambdas主要是语法糖,但并非完全如此。关于lambdas的一点是,它们通过下标顺序的直接初始化来捕获数组 [expr.prim.lambda]

  

22 - [...](对于数组成员,数组元素在增加时直接初始化   下标顺序。)[...]

这实际上很难实现;有必要使用类似std::index_sequence之类的东西来构造索引参数包,语义也不尽相同。

lambdas可以做的另一件事是捕获(可变参数)参数包;这通常不能完成(因为结构成员不能成为参数包扩展),除了像std::tuple这样的东西。

答案 2 :(得分:2)

基本上:它们是为了您的方便而存在的。

除了Maxim的回答,根据MSDN article about Lambda Expressions in C++

  

编写代码时,可能使用函数指针和函数   解决问题和执行计算的对象,尤其是在何时   你使用STL算法。函数指针和函数对象都有   优点和缺点 - 例如,函数指针有   最小的语法开销,但不保留范围内的状态,和   函数对象可以维护状态但需要语法开销   一个类定义。

     

lambda结合了功能的好处   指针和函数对象,避免它们的缺点。像一个   函数对象,lambda是灵活的,可以维持状态,但是   与函数对象不同,它的紧凑语法不需要类   定义。通过使用lambdas,您可以编写更少的代码   比同等的代码更麻烦,更不容易出错   功能对象。

答案 3 :(得分:0)

对于相应的函数对象,无捕获lambda的一个优点是它们可以转换为函数指针。

答案 4 :(得分:0)

  • 使用STL算法变得更加方便。

  • 如果你想写 在你的函数中可重用的代码,但可能没有意义 一个自由的功能,然后lambdas来救援。

例如。

void foo()
{
    auto validate = [] (const std::string& str) -> bool { // do some validation. };
    /// ... code.
    if (!validate("some info"))
    {
       // throw error;
    }

    ////  

     validate("some other info");
}