2012-07-04 61 views
4

我在MSDN页面上阅读了这个解释,了解了函数和函数指针相对于lambda表达式的优点。 “保留国家”的能力是什么意思?它是否与通过ref或value在封闭范围中捕获一些变量的能力有关?C++'保留状态'是什么意思?

http://msdn.microsoft.com/en-us/library/dd293608.aspx

在编写代码时,你可能会使用函数指针和功能 对象来解决问题和进行计算。功能 指针和函数对象有优点和缺点: 函数指针涉及最小的语法开销,但它们不在 保留一个范围内的状态;函数对象可以保持状态,但是它们需要类定义的语法开销。

Lambda表达式是一种编程技术,它结合了函数指针和函数对象的好处,并且避免了其缺点。 Lambda表达式非常灵活,并且可以保持 状态,就像函数对象一样,并且它们的紧凑语法将删除需要函数对象所需的类定义的 。 Lambda表达式使您能够编写代码不那么麻烦 并且比等效的函数对象更不容易出错。

以下示例将lambda表达式的使用与使用函数对象的 进行了比较。第一个示例使用lambda表达式 向控制台打印矢量对象中的每个元素是否为偶数或奇数的 。第二个示例使用函数对象来完成相同的任务 。

您能指出一些相关的主题范围,状态,维护状态,lambda表达式的优点吗?

感谢和问候

回答

7

函子和lambda都有超过正常功能的能力。这是记住函数调用之间的东西的能力。普通函数具有静态变量,但是它们是全局唯一的,如果你想要独立的函数对象具有它们自己独特的状态,这是不好的。下面是一个例子函数子类:

class Counter 
{ 
    int n; 
public: 
    Counter() :n(0) {} 
    int operator()() { return n++; }  
}; 

有了这个类,我可以创建作为一个功能的情况下,并在每次调用它时,它会记住N,例如以前的值

Counter x; 
cout << x() << '\n'; 
cout << x() << '\n'; 
cout << x() << '\n'; 

你不能用普通函数做到这一点。但你可以用lambdas做到这一点:

int n = 0; 
auto x = [=]() mutable { return n++; }; 
cout << x() << '\n'; 
cout << x() << '\n'; 
cout << x() << '\n'; 
+1

哼......你不需要在lambda定义的某个地方使用'mutable'来工作吗? –

+0

@MatthieuM。是的,谢谢。我几乎总是通过参考来捕捉,所以我忘了这一点。 –

+0

@BenjaminLindley但是,当通过引用捕获时,您需要一个可修改的引用对象的修改,不是吗? –