gpt4 book ai didi

c++ - 为什么没有 bool std::operator==(T1* a, std::shared_ptr b) 的重载?

转载 作者:太空狗 更新时间:2023-10-29 20:25:32 25 4
gpt4 key购买 nike

我注意到标准库没有为 shared_ptr 的相等运算符提供重载和一个原始指针。如果你有一个 std::unordered_set<std::shared_ptr<Foo>>,这尤其不方便。并且您想通过传递原始 Foo* 来删除元素

没有这种重载有什么具体原因吗?在我看来,它很容易实现:

template<typename T1, typename T2>
bool operator==(const T1 * a, const std::shared_ptr<T2> & b) {
return a == b.get();
}

...此实现会不会有任何危险或意外情况?

最佳答案

对于 unordered_set你需要的不仅仅是== , 你还需要 hash去工作。

对于 set ,一个透明的比较器让你可以通过非键类型的东西来查找东西。 set默认情况下是不透明的,因此运算符(operator)没有任何好处。

添加自己的比较器后,您可以覆盖 ==

可悲的是,unordered_set目前没有透明选项。为了在 unordered_set 中查找/删除/等等,您必须具有 key 类型。

您的重载有问题。一个更好的方法是:

template<class U, class...Ts>
auto operator==( U const* lhs, std::shared_ptr<Ts...> const& rhs )->decltype( lhs == rhs.get() ) {
return lhs == rhs.get();
}
template<class U, class...Ts>
auto operator==( std::shared_ptr<Ts...> const& lhs, U const* rhs )->decltype( lhs.get() == rhs ) {
return lhs.get() == rhs;
}

但请注意,合理地编写上述代码需要 C++11 支持。缺少上述内容的解决方案最终要么写得一团糟(使用 SFINAE),要么声称有一个 ==类型之间没有(并且对于其他 SFINAE 代码来说失败太晚,无法实现)。

但是<呢? ?嗯,<在原始指针上只是同一个对象中的一个好主意,所以在共享指针和原始指针之间公开它似乎是一个可怕的想法。所以现在我们正在接近std::less并希望通过智能指针和非智能指针之间的透明支持来增强它。

我们是否也支持混合智能指针(sharedunique ?)——天真地,您可能会说不,但是 unique_ptr如果更换删除器,则不必代表内存所有权! ( shared_ptr 也是如此)。具有不同删除器的智能指针是否应该被视为相等或等效?数据的含义可能因删除者而异。

现在,考虑到我已经设法从短短几分钟的工作中提出棘手的问题,并且这样的重载会鼓励原始指针和 shared_ptr 的混合。 、它甚至不能帮助解决您想用它解决的问题,也许这不是一个好主意。

也许是。这导致了它不在标准中的真正原因。

没有人提出并被接受。

如果您认为这是个好主意,我鼓励您查看提案流程。检查其他提案,找出正确的步骤,并一起提出提案。

如果这看起来太吓人了,您可能想要创建一个强大的库来提供上述比较运算符,并将其放入 boost 中,也许人们会使用它并说“哇,我们一直需要它!”

关于c++ - 为什么没有 bool std::operator==(T1* a, std::shared_ptr<T2> b) 的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23504616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com