【问题标题】:What is the real purpose of operator== for a std::function?operator== 对于 std::function 的真正目的是什么?
【发布时间】:2016-01-31 12:24:07
【问题描述】:

我不止一次看到std::functionoperator== 被滥用,我不得不解释它的真正用途。
为了有利于未来的读者清楚起见,here 是文档。
上面提到的文档说:

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

也就是说,std::function 也有 operator bool()here 是文档),其行为方式几乎相同,可以用来代替比较 my_func == nullptr
特别是据说:

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

我看不到一个可以使用而另一个不合适的情况,所以我无法理解operator== 的目的是什么,除了它可能会被误解和误用的大部分次。

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

【问题讨论】:

  • T* m,然后是 m==nullptrif(m) 以使 std::function 的行为类似于本机指针
  • 但是m==n 的行为不像原生指针...
  • @KarolyHorvath 我不确定比较函数指针是否有意义
  • @AngelusMortis:确实如此。假设你有一堆(例如:插件)并且你想删除一个条目......
  • 这正是我认为它违反直觉的原因,它仅适用于nullptrstd::functions,而我希望operator== 能提供更多。我想这也是它通常被错误使用的原因......

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


【解决方案1】:

目的很简单:

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

诚然,我认为他们在那里有点过火了......即使在模板中使用也是如此。


只允许与nullptr 比较的理由反映了original reason 完全排除比较:

IIIb。缺少比较运算符

函数对象包装器不支持比较运算符 ==、!=、、=。

基本原理:不能为函数对象合理定义(不)等式和排序关系。

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

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

.target_type().target<T>()

但是你需要非常了解可能被包装的东西才能使用它。

【讨论】:

  • 与问题的 cmets 一样,这并不完全是因为 operator== 仅适用于 nullptr 而我无法比较两个 std::functions。这就是为什么我认为它违反直觉。
  • @skypjack:让它用于比较两个std::functions 的问题非常简单:许多比较是不确定的,因为分配的内容是不可比较的。或者可能在应用程序的不同部分以不同方式打包。因此,无法以令人满意的方式提供这种比较。
  • 我明白了。因此,您确认我的印象是正确的:每当有人尝试使用比较运算符时,我都可以使用 bool 运算符,并请大家避免使用后者,或者至少在使用它之前仔细阅读文档,以避免错误的期望。
  • 不确定是否相关,但本文提到了“目标”之类的东西,并对==有意见。 open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1667.pdf
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 2015-01-20
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多