为什么weak_ptr没有比较运算符==?



如果我有一个vector<weak_ptr<Type>>,我不能使用vector::erase(remove())来删除所需的weak_ptr,因为它没有比较运算符==。

在比较通过weak_ptr::_Get()访问的基础原始指针vector::erase(remove_if()),必须将 lambda 谓词传递给 remove_if

_Get()以下划线和大写字母开头,表示它是为实现保留的,不应由用户访问。

很明显,weak_ptr不应该以这种方式存储,但为什么呢?


我正在考虑使用vector<weak_ptr<>>weak_ptr保存在子类中,该子类中只有我在管理器类中拥有的一些需要进一步处理的对象,从而通过lock()来确保它们尚未在管理类中删除(在多线程应用程序中(。

管理器会提醒子类创建和删除对象,使vector<weak_ptr<>>保持最新。

您可以将擦除-删除习惯用语与显式谓词一起使用。

例如:

#include <functional>
#include <iostream>
#include <memory>
#include <vector>
using std::cout;
using std::make_shared;
using std::remove_if;
using std::vector;
using std::weak_ptr;
int main()
{
  auto p7 = make_shared<int>(7);
  auto p8 = make_shared<int>(8);
  auto p10 = make_shared<int>(10);
  auto p11 = make_shared<int>(11);
  vector<weak_ptr<int>> v;
  v.push_back(p7);
  v.push_back(p8);
  {
    auto p9 = make_shared<int>(9);
    v.push_back(p9);
    // p9 dtor'd here
  }
  v.push_back(p10);
  v.push_back(p11);
  p8.reset(new int{18}); // old p8 dtor'd here
  p10 = make_shared<int>(110); // old p10 dtor'd here
  // Only 7 and 11 left.
  v.erase(remove_if(v.begin(), v.end(), [](auto w){ if (auto spt = w.lock()) return false; else return true; }), v.end() );
  for (auto w : v)
  {
    cout << "Value is ";
    if (auto s = w.lock())
    {
      cout << *s << "n";
    }
    else
    {
      cout << "MISSING!n";
    }
  }
}

相关内容

  • 没有找到相关文章

最新更新