在编译时捕获无效引用

Fed*_*ico 5 c++

只是为了提供上下文,这是我的代码的简单版本:

class myqueue
{
   struct readable
   {
       readable()
       {
          static int __next = 0;
          id = __next++;
       }
       int id;
   };
   std::list<readable> readers;
   public:
      readable& sub(){
          readers.emplace_back();
          return readers.back();
      }
      void unsub(readable& reader)
      {
        for (auto it = readers.begin(); it != readers.end(); ++it)
        {
            if (it->id == reader.id)
            {
                readers.erase(it);
                break;
            }
        }
      }
};


int main()
{ 
   myqueue q;
   auto& read = q.sub();
   q.unsub(read);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,在调用 后unsub(),您从中获得的引用sub()不再有效,对吗?

是否有更好(安全)的方法来处理这种情况并确保没有人会继续使用该引用?

我能想到的第一个替代方案是使用指针而不是引用在运行时检查有效性,但这是您每次都必须明确执行的操作,您也可以跳过/忘记它。如果能够在编译时捕获该引用的任何使用unsub()(就像 Rust 在移动对象后所做的那样),那就太好了。

有什么办法可以实现这一点吗?

我认为这在逻辑上很简单:

  1. something从获得sub()
  2. 用它
  3. 称呼unsub()
  4. 如果something该块再次出现=> XXX

也许使用静态分析器是可行的,我只是想知道是否可以在编译过程中实现这一点。