c++ - 这 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);
}
好像也一样?使用两种不同的“符号”并将值用作闭包?
解决方案
在这种情况下,它们都产生相同的结果。但是,它们之间存在逻辑差异。
[](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 variablevalue
。但是,该捕获被 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 之间的差异完全相同)。
推荐阅读
- c++ - 自动格式化程序将 >> 更改为 >>
- c++ - 以非特权用户身份查询 NTFS 特殊文件的元数据?
- javascript - 如何创建静态工作表 XLSX
- c# - base 64编码和解码的问题
- php - 无法在服务器端刷新 Google Calendar API 的访问令牌
- ruby-on-rails - Rails select_tag 使用范围进行简单过滤
- json - 在 iex 中运行 elixir 毒药命令
- javascript - Firefox 本地存储值有时会在新选项卡中丢失
- ios - 在 swift 中使用 xcode 10 未显示初始屏幕徽标图像
- protocol-buffers - 如何根据消息内容拦截和转发 GRPC 调用