C++ 对于std::函数,运算符==的真正用途是什么?

C++ 对于std::函数,运算符==的真正用途是什么?,c++,c++11,operators,comparison-operators,nullptr,C++,C++11,Operators,Comparison Operators,Nullptr,我见过std::function的操作符==多次被误用,我不得不解释它的真正用途。 为了便于将来读者阅读,本文档中提供了以下内容。 上述文件说明: 将std::函数与空指针进行比较。空函数(即没有可调用目标的函数)比较相等,非空函数比较非相等 也就是说,std::function还有一个操作符bool()(是文档),它的行为方式几乎相同,可以用来代替比较my_func==nullptr 特别是,据说: 检查*是否存储可调用函数目标,即不为空 我看不到一个可以使用,另一个不适合的情况,因此我无法理

我见过
std::function的
操作符==
多次被误用,我不得不解释它的真正用途。
为了便于将来读者阅读,本文档中提供了以下内容。
上述文件说明:

将std::函数与空指针进行比较。空函数(即没有可调用目标的函数)比较相等,非空函数比较非相等

也就是说,
std::function
还有一个
操作符bool()
(是文档),它的行为方式几乎相同,可以用来代替比较
my_func==nullptr

特别是,据说:

检查*是否存储可调用函数目标,即不为空

我看不到一个可以使用,另一个不适合的情况,因此我无法理解
运算符==
的用途,除了它在大多数情况下可能被误解和误用之外

是否存在无法使用的特殊情况?
它们是可互换的,因为它们实际上是相同的东西,还是有两个不同的操作符是有意义的?

目的很简单:

尽可能模拟普通函数指针的接口

诚然,我认为他们有点过火了。。。甚至可以在模板中使用


仅允许与
nullptr
进行比较的理由反映了完全忽略比较的原则:

IIIb。缺少比较运算符 比较运算符==,!=,=函数对象包装器不支持

理由:(in)不能为函数对象合理地定义等式和顺序关系

原因很简单:包装的目标可能不支持比较,可能包装方式不同,或者其他什么

如果确定函子包装的目标,有一种方法可以获得原始参数:


但是你需要非常深入地了解可能包装了什么才能利用它。

T*m
,然后
m==nullptr
if(m)
使
std::function
的行为像本机指针,但
m==n
的行为不像本机指针…@KarolyHorvath我不确定比较函数是否有意义pointers@AngelusMortis:当然可以。假设你有一堆(例如:插件),你想删除一个条目……这正是我认为它违反直觉的原因,它只适用于<代码> NulLPTR <代码> > <代码> STD::函数< /C> > S,而我希望从运算符==<代码>中得到更多。我想这也是它通常被错误使用的原因…正如在对问题的评论中,这并不完全是因为
operator==
只对
nullptr
起作用,我无法比较两个
std::function
s。这就是为什么我认为它是违反直觉的。@ SkpJug:使它用于比较两个代码> STD::函数
S很简单:许多比较是不确定的,因为分配的任何东西都是不可比的。或者可以在应用程序的不同部分进行不同的打包。因此,这种比较不能令人满意地提供。我明白了。因此,您确认我的印象是正确的:每当有人试图使用比较运算符时,我都可以使用bool运算符,并请大家避免使用后者,或者至少在使用前仔细阅读文档,以避免错误的预期。不确定是否相关,但本文提到了“目标”之类的东西,并对
==
有意见。