【问题标题】:Wrapped lambda expressions包装的 lambda 表达式
【发布时间】:2011-09-16 10:30:01
【问题描述】:

这里定义了一个兰巴包装表达式:

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

它是这样使用的:

f(someintvalue);

普通函数和包装的 lambda 有什么区别?

【问题讨论】:

  • “在 STL 中定义”?怎么样?
  • “它”?它是什么”?什么样的部分?您在 STL“中”在哪里看到此代码? STL 和 C++ 标准库都是 API。 AFAIK 他们都没有提供任何实现细节,例如这样的代码行。
  • 哦,我刚刚在关于 STL 的章节(Ivor Horton 的书)中读到了 lambda 表达式,所以我认为它可能是 STL 的一部分,我的错!
  • 有时,看起来任何与 Java 不相似的 C++ 都必须是 STL :(
  • 听起来 Ivor Horton 严重滥用了“STL”一词。真可惜。 :(

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


【解决方案1】:

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

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

对了,为什么要使用std::function?你可以这么写:

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

//call
int result = f(100.0);

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

【讨论】:

    【解决方案2】:

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

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

    std::function&lt;&gt; 旨在缓解那个问题:能够将函数指针(语义上)绑定到 lambda(或者实际上,任何callable object


    1:实际上该类型可以具有外部链接,但是您不能可移植地从另一个翻译单元引用该类型,因为实际类型是实现定义的(并且不需要甚至可以用 C++ 代码表达;在原始 TU 中,您可以使用 decltype 来获得 magic 类型。感谢 Luc 提供的准确度)

    【讨论】:

    • 嗯...因为 lambdas 是表达式,它们不需要提及链接。我的意思是你不能“extern”一个 lambda,因此你不能直接使用来自另一个编译单元的 lambda(你可以使用 std::function 中间)。我实际上需要检查具体的实现是否允许这样做
    • @Luc:很好。我认为您可以使用它来“证明”编译器生成的 lambda 类具有外部链接!但是您仍然不能从另一个编译单元访问该类型,因为您不能在表达式/变量上使用decltype。所以实际上你不能跨编译单元共享类型。这对你有意义吗?
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多