首页 > 解决方案 > 这 4 个 lambda 表达式有什么区别?

问题描述

我知道这对于非新手 开发人员来说似乎很愚蠢C++,但是这 4 个 lambda 表达式之间有什么区别? 代码

#include <iostream>
#include <math.h>
#include <functional>

inline double MyFunction(double a, double b, double c) {
    return (a + b + c);
}

inline void FunctionWrapper(std::function<double(double)> tempFunct, double value) {
    std::function<double(double)> funct;

    funct = tempFunct;

    std::cout << "result: " << funct(value) << std::endl;
}

int main()
{    
    double value = 100.0;

    FunctionWrapper([](double value) { return MyFunction(value, 1.0, 2.0); }, value);
    FunctionWrapper([](double value) -> double { return MyFunction(value, 1.0, 2.0); }, value);

    FunctionWrapper([value](double value) { return MyFunction(value, 1.0, 2.0); }, value);
    FunctionWrapper([value](double value) -> double { return MyFunction(value, 1.0, 2.0); }, value);
}

好像也一样?使用两种不同的“符号”并将值用作闭包?

标签: c++lambdaanonymous-function

解决方案


在这种情况下,它们都产生相同的结果。但是,它们之间存在逻辑差异。

  • [](double value) { return MyFunction(value, 1.0, 2.0); }

    这是一个 lambda,它接受一个类型的参数value并将其传递给MyFunction. return它的返回类型是从语句中推导出来的MyFunction,即double.

  • [](double value) -> double { return MyFunction(value, 1.0, 2.0); }

    这与之前的 lambda 相同,但这次它的返回类型被明确指定为double. MyFunction在这种情况下是一样的,但如果返回类型是别的东西,它会与第一个不同。在这种情况下,第一个会返回什么MyFunction返回,而这个仍然会返回double

  • [value](double value) { return MyFunction(value, 1.0, 2.0); }

    这取决于使用的标准版本。在 C++11 和 14 中,这个捕获main's local variable value。但是,该捕获被 lambda 的参数隐藏value,因此它实际上是无用的。如果将 lambda 声明为 eg ,情况会有所不同[value](double v) { return MyFunction(value, 1.0, 2.0); }。这将传递给捕获的value,而不是它的参数。

    在 C++17 及更高版本中,这已更改,实际上格式错误(编译错误)。不再允许将 lambda 参数命名为与您捕获的内容相同的名称。

    由于该更改是一份缺陷报告 ( CWG 2211 ),因此它具有追溯性,因此编译器即使在早期的 C++ 版本中拒绝此类代码也是合法的。

  • [value](double value) -> double { return MyFunction(value, 1.0, 2.0); }

    与 lambda 数字 3 相同,具有显式返回类型规范(3 和 4 之间的差异与 1 和 2 之间的差异完全相同)。


推荐阅读