难题:
为什么是 std::function,现代 C 代码库的一个组成部分,不具备相等比较功能?这个问题从一开始就困扰着程序员,导致管理可调用对象集合的混乱和困难。
早期的歧义:
在 C 语言的早期草案中11 标准中,operator== 和operator!= 的重载被声明但被删除,留下了一个从未得到充分解释的空洞。附带的评论“关闭类型系统中可能存在的漏洞”暗示了一个隐藏的缺陷,但其本质仍然是个谜。
漏洞和保障:
The怀疑的“漏洞”源于布尔转换函数的存在。在没有显式相等比较运算符的情况下,此函数可以允许通过 == 或 != 进行隐式比较。但是,此漏洞可能会导致意外行为,如下所示:
<code class="cpp">struct S { operator bool() { return false; } }; int main() { S a, b; bool are_equal(a == b); // Uses operator bool on a and b! }</code>
C 03 引入了 safe-bool 习惯用法,而 C 11 实现了显式 bool 转换函数来防止此漏洞。
与 std::shared_ptr 的对比:
与 std::function 不同,std::shared_ptr 具有明确定义的相等语义。如果两个指针都为空或者都非空并且指向同一个对象,则两个指针相等。这个明确的定义允许在 std::shared_ptr 中实现相等比较运算符。
解开谜团:
不使 std::function 相等可比较的基本原理源于为任意可调用类型定义有意义的平等标准的固有挑战。如果强制执行,它将给所有函数对象实现者带来负担,并且由于绑定参数的差异,它仍然可能导致不明确的比较。此外,缺少相等运算符可以有效地弥补隐式转换产生的漏洞。
以上是为什么 `std::function` 缺乏相等比较?的详细内容。更多信息请关注PHP中文网其他相关文章!