对于std :: function,operator ==的真正目的是什么?

时间:2016-01-31 12:24:07

标签: c++ c++11 operators comparison-operators nullptr

我看到operator==的{​​{1}}被误用了不止一次,我不得不解释它的实际用途。
为了清楚有利于未来的读者,here是文档 上面提到的文档说它:

  

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

也就是说,std::function还有std::functionhere是文档),其行为方式几乎相同,可用于代替比较operator bool()
特别是据说:

  

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

我看不出一个可以使用而另一个不适合的情况,所以我无法理解my_func == nullptr的目的是什么,除了它可能被误解和滥用最多的事实时代。

是否存在不能使用的特定情况? 它们是否可以互换,因为它们实际上是相同的东西,或者有两个不同的运算符是有意义的吗?

1 个答案:

答案 0 :(得分:2)

目的很简单:

尽可能合理地模拟普通函数指针的接口。

不可否认,我认为他们有点过分......即使是在模板中使用。

仅允许与nullptr进行比较的理由反映了original reason完全保留比较:

  

IIIb族。缺乏比较运算符

     

函数对象包装器不支持比较运算符==,!=,<,>,< =和> =。

     

基本原理:(in)无法为函数对象明确定义相等和排序关系。

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

如果你确定算子包装的目标是什么,有一种方法可以得到原始论点:

.target_type().target<T>()

但是你需要非常了解可能包含哪些内容才能使用它。