c ++'保留状态'是什么意思?

kir*_*off 4 c++ lambda state functional-programming

我在MSDN页面上阅读了这个解释,了解lambda表达式优于functor和函数指针的优点."保留国家"的能力是什么意思?它是否与通过ref或值封闭范围捕获某些变量的能力有关?

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

编写代码时,您可能使用函数指针和函数对象来解决问题并执行计算.函数指针和函数对象都有优点和缺点:函数指针涉及最小的语法开销,但它们不保留范围内的状态; 函数对象可以维护状态,但它们需要类定义的语法开销.

Lambda表达式是一种编程技术,它结合了函数指针和函数对象的优点,并避免了它们的缺点.Lambda表达式是灵活的,可以像函数对象一样维护状态,并且它们的紧凑语法消除了对函数对象所需的类定义的需要.Lambda表达式使您能够编写比等效函数对象更简单且更不容易出错的代码.

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

你能指出一些关于主题范围,状态,维护状态,lambda表达式优势的相关参考吗?

感谢致敬

Ben*_*ley 9

函数和lambda都具有超越正常函数的能力.它是在函数调用之间记住东西的能力.普通函数具有静态变量,但它们是全局唯一的,如果您希望单独的函数对象具有自己的唯一状态,那么这是不好的.这是一个functor类的示例:

class Counter
{
    int n;
public:
    Counter() :n(0) {}
    int operator()() { return n++; }    
};
Run Code Online (Sandbox Code Playgroud)

通过这个类,我可以创建一个充当函数的实例,每次调用它时,它都会记住n的前一个值,例如

Counter x;
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';
Run Code Online (Sandbox Code Playgroud)

你不能用正常的功能做到这一点.但你可以用lambdas做到这一点:

int n = 0;
auto x = [=]() mutable { return n++; };
cout << x() << '\n';
cout << x() << '\n';
cout << x() << '\n';
Run Code Online (Sandbox Code Playgroud)

  • 嗯……你不需要在 lambda 定义中的某个地方添加一个“mutable”才能使其工作吗? (2认同)
  • @ChristianRau:不,你没有。出于同样的原因,即使在 const 函数中,具有引用成员的类也可以自由修改所指对象。所指对象实际上不是成员。 (2认同)