Qt 示例 const_cast
Qt example const_cast
我正在检查 one of Qt's examples。在这个例子中,他们有一个简单的 TreeItem
class 放在树上:
class TreeItem
{
public:
explicit TreeItem(const QVector<QVariant> &data, TreeItem *parentItem = nullptr);
~TreeItem();
void appendChild(TreeItem *child);
TreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
TreeItem *parentItem();
private:
QVector<TreeItem*> m_childItems;
QVector<QVariant> m_itemData;
TreeItem *m_parentItem;
};
在int row() const;
方法的实现中,他们使用了一个const_cast
:
int TreeItem::row() const
{
if (m_parentItem)
return m_parentItem->m_childItems.indexOf(const_cast<TreeItem*>(this));
return 0;
}
对我来说,这听起来像是未定义的行为。如果这个对象实际上定义为 const
怎么办?但由于这是在官方网站上作为示例,我想知道我是否正确。起初我认为也许意图是永远不要创建 const TreeItem
但是将 row
方法标记为 const 将毫无意义。
问题:是否像示例中那样一直在 this
上使用 const_cast
?
这不是未定义的行为。 const_cast
只有当您开始的对象是 const 并且您修改了从强制转换中获得的对象时,才是未定义的行为。
return m_parentItem->m_childItems.indexOf(const_cast<TreeItem*>(this));
不会修改 const_cast<TreeItem*>(this)
,因为 indexOf
需要 const T&
。
我正在检查 one of Qt's examples。在这个例子中,他们有一个简单的 TreeItem
class 放在树上:
class TreeItem
{
public:
explicit TreeItem(const QVector<QVariant> &data, TreeItem *parentItem = nullptr);
~TreeItem();
void appendChild(TreeItem *child);
TreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
TreeItem *parentItem();
private:
QVector<TreeItem*> m_childItems;
QVector<QVariant> m_itemData;
TreeItem *m_parentItem;
};
在int row() const;
方法的实现中,他们使用了一个const_cast
:
int TreeItem::row() const
{
if (m_parentItem)
return m_parentItem->m_childItems.indexOf(const_cast<TreeItem*>(this));
return 0;
}
对我来说,这听起来像是未定义的行为。如果这个对象实际上定义为 const
怎么办?但由于这是在官方网站上作为示例,我想知道我是否正确。起初我认为也许意图是永远不要创建 const TreeItem
但是将 row
方法标记为 const 将毫无意义。
问题:是否像示例中那样一直在 this
上使用 const_cast
?
这不是未定义的行为。 const_cast
只有当您开始的对象是 const 并且您修改了从强制转换中获得的对象时,才是未定义的行为。
return m_parentItem->m_childItems.indexOf(const_cast<TreeItem*>(this));
不会修改 const_cast<TreeItem*>(this)
,因为 indexOf
需要 const T&
。