包装lambda表达式

Wrapped lambda expressions

本文关键字:表达式 lambda 包装      更新时间:2023-10-16

这里定义了一个lambda包装器表达式:

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

它是这样使用的:

f(someintvalue);

正常函数和包装lambda之间的区别是什么?

问题是-普通函数和包装lambda之间的区别是什么?

普通函数就是普通函数,你所说的"包装lambda"实际上是一个函数对象。

顺便问一下,为什么要用std::function ?您可以简单地这样写:

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

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

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

某些任务,如跨翻译单元访问lambda(类型),或从lambda中获取标准的成员函数指针地址,可能被证明是困难的/无用的,因为无法知道自动生成的"匿名"类型的实际类型(实际上是实现定义的)。

std::function<>的设计正是为了缓解的问题:能够将函数指针(语义上)绑定到lambda(或者实际上,任何可调用对象)


1:实际上类型可以有外部链接,但是你不能移植从另一个翻译单元引用它,因为实际类型是实现定义的(甚至不需要在c++代码中表示;在原始TU中,您可以使用decltype来获得魔法类型。谢谢Luc提供的准确信息)