如何比较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。
答案 0 :(得分:14)
您无法比较std::function
个对象,因为std::function
is not equality comparable。 lambda的闭包类型也不具有可比性。
但是,如果你的lambda没有捕获任何东西,lambda本身可以转换为函数指针,并且函数指针是相等的(但是,据我所知,完全没有说明是否在这个例子中{{1} }是are_1and2_equal
或true
):
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只回答 在我的回答评论中。