gpt4 book ai didi

c++ - 如果从不调用任何非常量方法,丢弃 const 是否安全

转载 作者:行者123 更新时间:2023-11-30 03:50:54 26 4
gpt4 key购买 nike

如果在强制转换后只调用 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;
};

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

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

最佳答案

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

因此,鉴于它被隐式转换回 const,行为定义明确。

关于c++ - 如果从不调用任何非常量方法,丢弃 const 是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31546748/

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