包裹的lambda表达式

时间:2011-09-16 10:30:01

标签: c++ function c++11 lambda

这是一个定义的lamba包装器表达式:

function <int(double)> f = 
     [](double x) -> int{ return static_cast <int> (x*x); };

它的用法如下:

f(someintvalue);

普通函数和包裹的lambdas之间有什么区别?

2 个答案:

答案 0 :(得分:2)

  

问题是 - 普通函数和包裹的lambda有什么区别?

普通函数是一个普通函数,你所谓的“包裹的lambda”实际上是一个函数对象。

顺便问一下,为什么要使用std::function?你可以写下这个:

auto f = [](double x) { return static_cast <int> (x*x); };

//call
int result = f(100.0);

另外,我省略了返回类型,因为编译器从返回表达式中隐含地知道它。无需在lambda表达式中编写-> int

答案 1 :(得分:1)

Lambdas可以捕获周围的范围([=]或[&amp;]),从而产生包含成员函数的匿名结构。

某些任务,比如跨翻译单元访问lambda(类型),或从lambdas中获取标准指向成员函数的地址,可能会很难/无用,因为无法知道自动生成的“匿名”类型的实际类型(并且是实际上是实现定义的。)

std::function<>旨在缓解 问题:能够将函数指针(语义上)绑定到lambda(或者实际上,无论callable object


  

1 :实际上类型可以有外部链接,但是你不能可移植地引用来自另一个翻译单元的类型,因为实际类型是实现定义的(并且不需要甚至可以在C ++代码中表达;​​在原始TU中你可以使用decltype来获得魔法类型。谢谢,Luc对此有很好的准确性)