这个问题也适用于boost::function和std::tr1::function.
std::function 不相等的平等:
#include <functional>
void foo() { }
int main() {
std::function<void()> f(foo), g(foo);
bool are_equal(f == g); // Error: f and g are not equality comparable
}
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,operator==和operator!=重载并不存在.在早期的C++ 11草案中,使用注释(N3092§20.8.14.2)将重载声明为已删除:
// deleted overloads close possible hole in the type system
Run Code Online (Sandbox Code Playgroud)
它没有说明"类型系统中可能存在的漏洞"是什么.在TR1和Boost中,声明了重载但未定义.TR1规范评论(N1836§3.7.2.6):
这些成员函数应保持未定义.
[ 注意:类似布尔值的转换会打开一个漏洞,通过
==或可以比较两个函数实例!=.这些未定义的void运算符会关闭漏洞并确保编译时错误.- 尾注 ]
我对"漏洞"的理解是,如果我们有bool转换函数,那么转换可以用于相等比较(以及其他情况):
struct S {
operator bool() { return false; }
};
int main() { …Run Code Online (Sandbox Code Playgroud)