如果从不调用任何非const方法,抛弃const是否安全

时间:2015-07-21 18:20:01

标签: c++ stl iterator const undefined-behavior

如果在演员表之后只调用const方法,那么从指向对象的指针抛弃const仍然是未定义的行为吗?

我正在尝试为一个类实现迭代器和const_iterator,其中解除引用的迭代器是一个具有少量状态的代理对象和一个指向父对象的指针(简化如下)

虽然const限定代理只调用父类的const方法,但它仍然需要构造函数中的非const指针。

class query {
   public:
      int  get (int r, int c) const;
      void set (int r, int c, int v);

      class iterator {
         iterator (query *q, int r) : m_qry(q), m_row(r) {}
         row operator* const () { return row(m_qry, m_row); }

         query *m_qry;
         int m_row;
      };

      class const_iterator {
         const_iterator (const query *q, int r) : m_qry(q), m_row(r) {}

         const row operator* const () {
            // protected constructor for row needs cast
            return row(const_cast<query *>(m_qry), m_row);
         }

         const query *m_qry;
         int m_row;
      };

      iterator       begin() { return iterator(this, 0); }
      const_iterator begin() { return const_iterator(this, 0); }
};

class row {
   friend query;

   public:
      int get (int col) const {
         // can be called by both row and const row
         return m_qry->get(m_row, col);
      }

      void set (int col, int v) {
         // cannot be called for const row
         return m_qry->set(m_row, col, v);
      } 

   protected:
      row (query *q, int row) : m_qry(q), m_row(r) {}

   private:
      query *m_qry;
      int m_row;
};

我宁愿避免为不同的迭代器使用不同的类,因为这需要相当多的代码重复。

如果不可能,是否还有其他具有良好性能的替代设计模式?

1 个答案:

答案 0 :(得分:2)

在const方法中,this指针是const类型。

因此,它被隐式地强制转换为const,行为定义得很好。