难题:
为什么是 std::function,现代 C 代码库的一个组成部分,不具备相等比较功能?这个问题从一开始就困扰着程序员,导致管理可调用对象集合的混乱和困难。
早期的歧义:
在 C 语言的早期草案中11 标准中,operator== 和operator!= 的重载被声明但被删除,留下了一个从未得到充分解释的空洞。附带的评论“关闭类型系统中可能存在的漏洞”暗示了一个隐藏的缺陷,但其本质仍然是个谜。
漏洞和保障:
The怀疑的“漏洞”源于布尔转换函数的存在。在没有显式相等比较运算符的情况下,此函数可以允许通过 == 或 != 进行隐式比较。然而,这个漏洞可能会导致意外的行为,如:
struct S {
operator bool() { return false; }
};
int main() {
S a, b;
bool are_equal(a == b); // Uses operator bool on a and b!
}
C 03 引入了 safe-bool 习惯用法,C 11 实现了显式 bool 转换函数来防止此漏洞。
与 std::shared_ptr:[ 的对比&&&]
与 std::function 不同,std::shared_ptr 具有明确定义的相等语义。如果两个指针都为空或者都非空并且指向同一个对象,则两个指针相等。这个明确的定义允许在 std::shared_ptr 中实现相等比较运算符。解开谜团:
不使 std::function 相等可比较的理由源于为任意可调用类型定义有意义的平等标准的固有挑战。如果强制执行,它将给所有函数对象实现者带来负担,并且由于绑定参数的差异,它仍然可能导致不明确的比较。此外,缺少相等运算符可以有效地消除隐式转换产生的漏洞。免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3