【发布时间】:2020-06-11 19:37:46
【问题描述】:
谁能解释 lambda 函数在 std::function 中是如何表示的?编译器和用作容器的 std::function 是否存在隐式转换?
我最近询问了一个略有不同的question,它被标记为与this question 重复。答案是未定义和未指定 lambda 函数的类型。我发现一些代码似乎为 lambda 函数提供了一个容器,如下所示。我还包括了一个 Stroustrup 引用,这似乎与 lambda 函数没有定义类型相矛盾,但它说它是一个函数闭包类型。这只会进一步混淆问题。
更新: 关于实现函数的部分答案是here。
感谢您的指导。
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
static vector<function<void(int)>> cbl;
static vector<function<int(int)>> cblr;
class GT {
public:
int operator()(int x) {return x;}
};
void f()
{
auto op = [](int x) {cout << x << endl;};
cbl.push_back(op);
for (auto& p : cbl)
p(1);
auto op2 = [](int x) {return x;};
cblr.push_back(op2);
cblr.push_back(GT());
for (auto& p : cblr)
cout << p(99) << endl;
}
int main(int argc, char *argv[])
{
f();
return 0;
}
编译和结果:
g++ -pedantic -Wall test130.cc && ./a.out
1
99
99
Stroustrup 在 C++ 第 4 版第 297 页中谈到了这一点:
为了允许 lambda 表达式的优化版本,a 未定义 lambda 表达式。但是,它被定义为 §11.4.1 中呈现的样式的函数对象的类型。这 类型,称为闭包类型,是 lambda 独有的,所以没有两个 lambda 具有相同的类型。如果两个 lambda 具有相同的类型,则 模板实例化机制可能已经被混淆了。一种 lambda 是具有构造函数和 const 成员的本地类类型 函数运算符()()。
【问题讨论】:
-
相关,可能是骗人的:stackoverflow.com/questions/18453145/…
-
编译器知道 lambda 的类型。
-
“这似乎与 lambda 函数没有类型相矛盾” - 你仍然没有放弃这个误解。 Lambda 的有一个类型。每个对象都有一个类型。
-
跟随 StoryTeller 的评论,一个 lambda 有一个 unspecified 类类型。这并不意味着它没有类型,只是我们不知道它的名称。我们知道它是一个类,所以它是一个仿函数
-
正确。就像
5有int类型一样,lambda 表达式也有自己的类型。但与5不同的是,C++ 标准并没有告诉您应该调用什么类型的 lambda 或编译器应该实现它的确切方式。那是未指定的。