C ++ lambda运算符==

时间:2010-10-21 15:00:24

标签: c++ lambda

如何比较C ++中的两个lambda函数(Visual Studio 2010)?

std::function<void ()> lambda1 = []() {};
std::function<void ()> lambda2 = []() {};
bool eq1 = (lambda1 == lambda1);
bool eq2 = (lambda1 != lambda2);

我收到编译错误,声称运算符==无法访问。

编辑:我正在尝试比较函数实例。所以lambda1 == lambda1应该返回true,而lambda1 == lambda2应该返回false。

4 个答案:

答案 0 :(得分:14)

您无法比较std::function个对象,因为std::function is not equality comparable。 lambda的闭包类型也不具有可比性。

但是,如果你的lambda没有捕获任何东西,lambda本身可以转换为函数指针,并且函数指针是相等的(但是,据我所知,完全没有说明是否在这个例子中{{1} }是are_1and2_equaltrue):

false

Visual C++ 2010 does not support this conversion。直到Visual C ++发布之前,转换才被添加到C ++ 0x中。

答案 1 :(得分:2)

您无法比较功能,结束。

你最多可以比较指向具有该概念的语言中的函数的指针(例如,这也是EQ在Lisp中的作用。并且它对于不占用内存中相同位置的等效函数而言失败。)

答案 2 :(得分:0)

这是不可能的。

证明草图:是否可以计算

f1 == f2

那么也可以计算

f == infiniteLoop

并解决停机问题。

答案 3 :(得分:-3)

最简单的答案:所有模板&lt;&gt; class function的operator ==()s是私有的。

后续问题:如果您期望以下内容:   - 比较功能的地址
  - 比较两个不同的对象(类型为std :: function&lt; void()&gt;
  - 比较两个抽象函数

编辑(近5年后):

我觉得有趣的是没有评论的downvotes。如果downvotes是因为C ++ 11改变了std :: function :: operator ==()的访问级别,那么我说选民不明白时间是如何工作的。如果问题是因为提问者没有弄清楚他想象的运营商==()会比较,也许选民应该通过问题立即看到多小时的讨论,而OP只回答 在我的回答评论中。