标题可能不准确,但我想不出任何简短的标题。 (随意建议或编辑我的问题。)
我想知道使用lambda函数是否有任何其他优点,除了事实上不需要显式定义(和写入)函数的整个类定义或定义要使用的单独函数(可能)只有一次。换句话说,lambda是为了方便而引入的还是更多呢?
编辑: 有一点要补充我的问题。 Lambdas允许程序员写得更少,更方便,并且因此他们不易出错。这本身就是一种与方便不同的东西/理由,但却与它有关。
答案 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");
}